gpt4 book ai didi

python - 在命名空间声明不一致的文档上使用 iterparse,随后使用 xpath

转载 作者:太空宇宙 更新时间:2023-11-03 11:33:23 25 4
gpt4 key购买 nike

我需要整理一段代码,将一个可能很大的 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 查询。这有一定的道理,但我想知道是否有更简单的方法来解决这个问题。

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

最佳答案

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

关于python - 在命名空间声明不一致的文档上使用 iterparse,随后使用 xpath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12332621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com