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