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

问题描述 投票:0回答:1

我有一个复杂的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
python python-3.x elementtree
1个回答
2
投票

当你用命名空间处理xml时,你必须指定使用的命名空间.为此,我。

  • 为了达到这个目的,我: ns 变量(一个字典),以命名空间快捷键为键,以完整的命名空间为值(这里只有一个字典条目)。
  • 中使用这个变量作为第二个参数。找到所有.

还要注意的是 找到所有 包含 一些。 作为元素名的初始部分。

试试下面的代码。

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)

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

© www.soinside.com 2019 - 2024. All rights reserved.