Python ElementTree 模块:如何在使用“find”、“findall”方法时忽略 XML 文件的名称空间来定位匹配元素

新手上路,请多包涵

我想使用 findall 的方法在 ElementTree 模块中定位源xml文件的一些元素。

但是,源 xml 文件 (test.xml) 具有名称空间。我截断了部分 xml 文件作为示例:

 <?xml version="1.0" encoding="iso-8859-1"?>
<XML_HEADER xmlns="http://www.test.com">
    <TYPE>Updates</TYPE>
    <DATE>9/26/2012 10:30:34 AM</DATE>
    <COPYRIGHT_NOTICE>All Rights Reserved.</COPYRIGHT_NOTICE>
    <LICENSE>newlicense.htm</LICENSE>
    <DEAL_LEVEL>
        <PAID_OFF>N</PAID_OFF>
        </DEAL_LEVEL>
</XML_HEADER>

示例 python 代码如下:

 from xml.etree import ElementTree as ET
tree = ET.parse(r"test.xml")
el1 = tree.findall("DEAL_LEVEL/PAID_OFF") # Return None
el2 = tree.findall("{http://www.test.com}DEAL_LEVEL/{http://www.test.com}PAID_OFF") # Return <Element '{http://www.test.com}DEAL_LEVEL/PAID_OFF' at 0xb78b90>

虽然使用 "{http://www.test.com}" 可以,但是在每个标签前加上命名空间非常不方便。

在使用诸如 findfindall 等函数时,如何忽略命名空间,…?

原文由 KevinLeng 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 971
1 个回答

与其修改 XML 文档本身,不如解析它然后修改结果中的标记。这样你就可以处理多个命名空间和命名空间别名:

 from io import StringIO  # for Python 2 import from StringIO instead
import xml.etree.ElementTree as ET

# instead of ET.fromstring(xml)
it = ET.iterparse(StringIO(xml))
for _, el in it:
    _, _, el.tag = el.tag.rpartition('}') # strip ns
root = it.root

这是基于 这里 的讨论。

原文由 nonagon 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏