【问题标题】:Python 3 parse xml file with ElementTreePython 3 使用 ElementTree 解析 xml 文件
【发布时间】:2019-03-23 10:38:51
【问题描述】:

帮助,我有以下 XML 文件,我正在尝试从中读取和提取数据,下面是 xml 文件的摘录,

<Variable name="Inboard_ED_mm" state="Output" type="double[]">17.154, 17.154, 17.154, 17.154, 17.154, 17.154, 17.154, 17.154, 17.154, 17.154, 17.154, 17.154, 17.154, 17.154<Properties><Property name="index">25</Property><Property name="description"></Property><Property name="upperBound">0</Property><Property name="hasUpperBound">false</Property><Property name="lowerBound">0</Property><Property name="hasLowerBound">false</Property><Property name="units"></Property><Property name="enumeratedValues"></Property><Property name="enumeratedAliases"></Property><Property name="validity">true</Property><Property name="autoSize">true</Property><Property name="userSlices"></Property></Properties></Variable>

我正在尝试提取以下内容,17.154, 17.154, 17.154, 17.154, 17.154, 17.154, 17.154, 17.154, 17.154, 17.154, 17.154, 17.154, 17.154, 17.154

我已经完成了这里的示例 xml.etree.ElementTree — The ElementTree XML API 并且我可以让示例工作,但是当我修改上述 xml 的代码时,代码什么也没有返回!

这是我的代码,

import xml.etree.ElementTree as ET
work_dir = r"C:\Temp\APROCONE\Python"

with open(model.xml, 'rt') as f:
    tree = ET.parse(f)
    root = tree.getroot()

for Variable in root.findall('Variable'):
    type = Variable.find('type').text
    name = Variable.get('name')
    print(name, type)

有什么想法吗?提前感谢您的帮助。

编辑: 感谢所有发表评论的人。在你的建议下,我玩了一会,搜索了一下,得到了以下代码,

with open(os.path.join(work_dir, "output.txt"), "w") as f:
for child1Tag in root.getchildren():
    for child2Tag in child1Tag.getchildren():
        for child3Tag in child2Tag.getchildren():
            for child4Tag in child3Tag.getchildren():
                for child5Tag in child4Tag.getchildren():
                    name = child5Tag.get('name')
                    if name == "Inboard_ED_mm":
                        print(child5Tag.attrib, file=f)
                        print(name, file=f)
                        print(child5Tag.text, file=f)

要返回以下内容,

{'name': 'Inboard_ED_mm', 'state': 'Output', 'type': 'double[]'}
Inboard_ED_mm
17.154, 17.154, 17.154, 17.154, 17.154, 17.154, 17.154, 17.154, 17.154, 17.154, 17.154, 17.154, 17.154, 17.154

我知道,不是世界上最好的代码,任何关于如何简化代码的想法都非常受欢迎。

【问题讨论】:

  • “下面是 xml 文件的摘录” - 问题可能是 Variable 在默认命名空间中。您是否在 XML 中未显示的任何位置有 xmlns="???"
  • @Daniel Haley,感谢您的回复,抱歉,我在文件中找不到“xmlns”。

标签: python python-3.x xml-parsing elementtree xml.etree


【解决方案1】:

您说上面是 XML 文件的“提取”。 XML 的结构很重要。以上只是位于根节点内吗?

for Variable in root.findall('Variable'):
    print(Variable.get('name'), Variable.text)

或者它是否存在于 XML 树结构中更深的某个已知级别?

for Variable in root.findall('Path/To/Variable'):
    print(Variable.get('name'), Variable.text)

或者它是否存在于 XML 树结构中某个未指定的更深层次?

for Variable in root.findall('.//Variable'):
    print(Variable.get('name'), Variable.text)

演示最后两个:

>>> import xml.etree.ElementTree as ET
>>> src = """
<root>
 <SubNode>
  <Variable name='x'>17.154, ..., 17.154<Properties>...</Properties></Variable>
  <Variable name='y'>14.174, ..., 15.471<Properties>...</Properties></Variable>
 </SubNode>
</root>"""
>>> root = ET.fromstring(src)
>>> for Variable in root.findall('SubNode/Variable'):
        print(Variable.get('name'), Variable.text)


x 17.154, ..., 17.154
y 14.174, ..., 15.471
>>>
>>> for Variable in root.findall('.//Variable'):
        print(Variable.get('name'), Variable.text)


x 17.154, ..., 17.154
y 14.174, ..., 15.471

更新

根据您的新/更清晰/更新的问题,您正在寻找:

for child in root.findall("*/*/*/*/Variable[@name='Inboard_ED_mm']"):
    print(child.attrib, file=f)
    print(child.get('name'), file=f)
    print(child.text, file=f)

for child in root.findall(".//Variable[@name='Inboard_ED_mm']"):
    print(child.attrib, file=f)
    print(child.get('name'), file=f)
    print(child.text, file=f)

使用标签 1 到 4 的准确标签名,我们可以为您提供更准确的 XPath,而不是依赖于 */*/*/*/

【讨论】:

  • 感谢您的回复,经过一番播放和搜索,它位于根节点的深处!我已经在原始问题中添加了代码。
  • 啊 - 您正在寻找具有精确 name 属性的 Variable 标记。有一个 XPath。查看更新。
【解决方案2】:

您的根节点已经是Variable 标记,因此您将找不到带有Variable 标记和findall 的任何内容,只能搜索子节点。您应该简单地输出根节点的text 属性:

print(root.text)

【讨论】:

  • 感谢您的回复,您的回答帮助我找到了解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-16
相关资源
最近更新 更多