Chen Yangjian's Blog

Carpe diem - Seize the day

Flex 与 ElementTree 里头 XML 的 Namespace 的问题

| Comments

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'})

Comments