繁体   English   中英

如何使用Python的ElementTree获取孩子的孩子

[英]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>

重要部分位于子“ vars”下。 我想使用Python创建一个文件,该文件在发送参数“ input2”时将显示“ 45.6”。

到目前为止,我可以阅读“ visu”的所有子项,但不知道如何实际告诉Python在“子项”中进行搜索。 这是到目前为止我得到的:

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搜索

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

这将在<vars> <var>标记正下方搜索<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()可能会更容易,更简洁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM