我正在构建一个与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
这将在<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'
您可以通过困难的方式执行此操作,并手动遍历所有元素。每个元素都可以直接循环:
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()
可能会更容易,更简洁。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句