【问题标题】:How to get the child of child using Python's ElementTree如何使用 Python 的 ElementTree 获取孩子的孩子
【发布时间】:2015-03-01 01:23:06
【问题描述】:

我正在构建一个与 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

有什么想法可以完成脚本吗? (或者可能是一种更有效的编程方式?)

【问题讨论】:

    标签: python elementtree


    【解决方案1】:

    你最好在这里使用XPath search

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

    这会在&lt;vars&gt; 标签的正下方搜索&lt;var&gt; 标签,其属性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() 可能会更简单、更简洁。

    【讨论】:

    • 感谢您的回答,我将使用 find() 实现解决方案。
    猜你喜欢
    • 2018-08-10
    • 2014-03-27
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    相关资源
    最近更新 更多