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

2024-02-11

我想用的方法findall定位源 xml 文件的某些元素ElementTree module.

但是,源 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}"可行,在每个标签前面添加命名空间非常不方便。

使用类似函数时如何忽略名称空间find, findall, ...?


最好不要修改 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

这是基于讨论here http://bugs.python.org/issue18304.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐