4

我需要整理一段代码,将可能很大的 XML 文件解析为自定义 Python 对象。思路大致如下:

from lxml import etree
for e, tag in etree.iterparse(source, tag='Foo'):
    print tag.xpath('bar/baz')[42] # there's actually a function call here

问题是,有些文档有命名空间声明,有些则没有。这意味着在上面的代码中,tag='Foo'xpath部分都不起作用。

现在我一直在忍受丑陋的东西

for e, tag in etree.iterparse(source):
    if tag.tag.endswith('Foo'):
        print tag.xpath('*[local-name()="bar"]/*[local-name()="baz"]')[42]

但这太糟糕了,即使它工作正常,我也想把它做好。(我想它也应该更慢。)

有没有办法编写理智的代码来解释这两种情况iterparse?现在我只能想到捕获start-nsend-ns事件并更新“状态保持”变量,我必须将其传递给循环中调用的函数来完成工作。然后该函数将xpath相应地构造查询。这是有道理的,但我想知道是否有更简单的方法。

PS我显然已经尝试过四处搜索,但还没有找到一个既可以使用也可以不使用命名空间的解决方案。我也会接受从 XML 中消除名称空间的解决方案,但前提是它不会在进程中将整个树存储在 RAM 中。

4

1 回答 1

2

所有元素都有一个.nsmap映射属性;使用它来检测您的命名空间并相应地分支。

于 2012-09-08T17:24:23.320 回答