使用 Python 解析带有命名空间的 XML 文件

Parse XML file with namespace with Python

我有一个复杂的 xml 我正在尝试从中提取数据。

<?xml version="1.0" ?>
<root xmlns="something.something.com">
    <Save>
        <AdditionalInfo>
            <Name></Name>
            <Time></Time>
            <UtilityVersion></UtilityVersion>
            <XMLVersion></XMLVersion>
            <PluginName></PluginName>
            <ClassName></ClassName>
        </AdditionalInfo>
        <Data>
            <session>
                <xyDataObjects>
                    <xyData Key="'info'" ObjectType="moreinfo" Type="evenmoreinfo">
                        <axis1QuantityType ObjectType="guesswhat" Type="info!">
                            <label></label>
                            <type></type>
                        </axis1QuantityType>
    ... and so on and so on

该文件有多个以保存和/保存块开始和结束的块,我要查找的信息可以与标签一样远,甚至更远。

ElementTree.Iter 似乎是我的解决方案,因为它会遍历每个保存块并找到我正在寻找的 <label> 信息,但不幸的是,它不接受命名空间参数。

我还有哪些其他选择?我试图保持我的代码灵活,因为我预见 xml 文件的结构将来可能会改变,而且很简单,所以我宁愿不实现类似的东西:

tree= ET.parse('dblank.xml')
root = tree.getroot()
for i in range(len(root)):
        Array[i]=root[i][1][0][0][0][0][0].text

当您使用命名空间处理 XML 时,您必须指定使用的命名空间。 为此本人:

  • 定义了 ns 变量(字典),以名称空间快捷方式作为键 和完整的命名空间作为值(这里是一个字典条目),
  • 使用此变量作为 findall.
  • 中的第二个参数

另请注意,findall 的第一个参数包含 some: 作为 元素名称的初始部分。

试试下面的代码:

import xml.etree.ElementTree as et

tree = et.parse('Input.xml')
root = tree.getroot()
ns = {'some': 'something.something.com'}

for elem in root.findall('.//some:label', ns):
    print(elem.text)

当然,这只是一个如何引用现有元素的例子。 根据您的需要进行更改。