如何使用 Python 的 ElementTree 获取 child 的 child
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>
重要部分在 child "vars" 下找到。使用 Python 我想制作一个文件,当发送参数 "input2" 时它将打印“45.6”。
到目前为止,我可以阅读 "visu" 的所有 children,但不知道如何真正告诉 Python 在 "the child of 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
对如何完成脚本有任何想法吗? (或者更有效的编程方式?)
你最好在这里使用 XPath search:
name = 'input2'
value = root.find('.//vars/var[@name="{}"]'.format(name)).text
这将搜索 <vars>
标签正下方的 <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()
可能会更简单、更简洁。
我正在构建一个与 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>
重要部分在 child "vars" 下找到。使用 Python 我想制作一个文件,当发送参数 "input2" 时它将打印“45.6”。
到目前为止,我可以阅读 "visu" 的所有 children,但不知道如何真正告诉 Python 在 "the child of 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
对如何完成脚本有任何想法吗? (或者更有效的编程方式?)
你最好在这里使用 XPath search:
name = 'input2'
value = root.find('.//vars/var[@name="{}"]'.format(name)).text
这将搜索 <vars>
标签正下方的 <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()
可能会更简单、更简洁。