Flex、ETree、XML 的 Namespace…… 好奇怪居然可以扯到一起。
Adobe® Flex 是个对自家脚本语言 ActionScript 的封装,弄了许多趁手的控件、Layout 工具。ActionScript 因为有 e4x,可以说是完美支持 XML。前些日子试着在 Flex 里头操作一个既有的 XML,准确的说,是个 Jasper Report,.jrxml 文件。导入之后 e4x 的趁手的 dot(.) 和 attribute(@) 全然不起作用。后来发现是 XML 的 namespace 的问题。
解决办法简单,把该 XML 的 namespace 定义一下然后 use
,就可以了。
var foo = "http://www.adobe.com/flash/proxy";
use namespace foo;
因为如果不指定的话,e4x 去找的 tag 和 attribute 确实 namespace 前缀,就找不到了。
而后来在 ElementTree 里头碰到的问题也是一样。ETree 是 Python 2.5 自带的除了 dom 与 sax 以外的另一个 xml 操作库,写起来要简洁一些,只是木有 e4x 方便。同样,因为 XML 的命名空间的关系,使用 ETree 的 .find 的时候,如果忘了加命名空间前缀,就会找不到,所以应该这样写:
namespace="http://xspf.org/ns/0/"
tree.findall('.//{%s}track' % namespace)
麻烦的是,ETree 里暂时木有可以 once and for all 指定 namespace 的办法。
顺带一提,Python 里头函数调用时,如果有参数叫做 class,直接显式地写实不行滴,解决办法是:
w.element("Node", **{'class': 'oops'})