【问题标题】:Parse XML file with namespace with Python使用 Python 解析带有命名空间的 XML 文件
【发布时间】:2020-05-01 22:48:00
【问题描述】:

我有一个复杂的 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

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

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

我还有哪些其他选择?我试图保持我的代码灵活,因为我预见到 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

【问题讨论】:

  • 您可以使用xpath 查询来查找您想要的信息。到目前为止,您尝试过什么?
  • “找到我正在寻找的信息”。您究竟在寻找什么信息?你仍然可以使用iter();在检查条件时,您只需要考虑元素的命名空间。或者您可以将findall() 与通配符一起使用。见stackoverflow.com/a/61154644/407651

标签: python python-3.x elementtree


【解决方案1】:

当您使用命名空间处理 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)

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

【讨论】:

  • Xpath 似乎是这样做的方法。快速测试证实这很容易奏效。感谢您的意见。
猜你喜欢
  • 2020-11-02
  • 2014-01-30
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 2018-07-15
相关资源
最近更新 更多