Ñ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()可能会更容易、更简洁。