如何使用 Python 的 ElementTree 获取 child 的 child

How to get the child of child using Python's ElementTree

我正在构建一个与 PLC 通信的 Python 文件。编译时,PLC 会创建一个 XML 文件,其中包含有关程序的重要信息。 XML 看起来更像这样:

<visu>
    <time>12:34</time>
    <name>my_visu</name>
    <language>english</language>
    <vars>
        <var name="input1">2</var>
        <var name="input2">45.6</var>
        <var name="input3">"hello"</var>
    </vars>
</visu>

重要部分在 child "vars" 下找到。使用 Python 我想制作一个文件,当发送参数 "input2" 时它将打印“45.6”。

到目前为止,我可以阅读 "visu" 的所有 children,但不知道如何真正告诉 Python 在 "the child of child" 中搜索。这是我到目前为止得到的:

tree = ET.parse("file.xml")
root = tree.getroot()
for child in root:
    if child.tag == "vars":
        .......
        if ( "childchild".attrib.get("name") == "input2" ):
            print "childchild".text

对如何完成脚本有任何想法吗? (或者更有效的编程方式?)

你最好在这里使用 XPath search:

name = 'input2'
value = root.find('.//vars/var[@name="{}"]'.format(name)).text

这将搜索 <vars> 标签正下方的 <var> 标签,其属性 name 等于 Python name 给出的值变量,然后检索该标签的文本值。

演示:

>>> from xml.etree import ElementTree as ET
>>> sample = '''\
... <visu>
...     <time>12:34</time>
...     <name>my_visu</name>
...     <language>english</language>
...     <vars>
...         <var name="input1">2</var>
...         <var name="input2">45.6</var>
...         <var name="input3">"hello"</var>
...     </vars>
... </visu>
... '''
>>> root = ET.fromstring(sample)
>>> name = 'input2'
>>> root.find('.//vars/var[@name="{}"]'.format(name)).text
'45.6'

您可以通过困难的方式来执行此操作并手动遍历所有元素;每个元素都可以直接循环:

name = 'input2'
for elem in root:
    if elem.tag == 'vars':
        for var in elem:
           if var.attrib.get('name') == name:
               print var.text

但使用 element.find()element.find_all() 可能会更简单、更简洁。