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

Ñho*_*sko 9 python 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>
Run Code Online (Sandbox Code Playgroud)

重要的部分可以在子“vars”下找到。使用Python我想创建一个文件,当发送参数“input2”时,它将打印“45.6”。

到目前为止,我可以读取“visu”的所有子级,但不知道如何实际告诉Python在“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
Run Code Online (Sandbox Code Playgroud)

我有什么想法可以完成脚本吗?(或者也许是一种更有效的编程方式?)

Mar*_*ers 10

您最好在这里使用XPath 搜索:

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

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

演示:

>>> 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'
Run Code Online (Sandbox Code Playgroud)

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

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

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