基于不同子元素的值获取子元素

时间:2016-12-21 19:51:40

标签: python elementtree

尝试使用Python中的ElementTree获取XML文件中所有元素的标题,其中child2属性ipsum文本内容为" true"。这是XML:

<element>
    <title>Hello world</title>
    <child1>Lorem</child1>
    <child2 attr="ipsum">true</child2>
</element>
<element>
    <title>Hello world 2</title>
    <child1>Lorem</child1>
</element>
<element>
    <title>Hello world 3</title>
    <child1>Lorem</child1>
    <child2 attr="ipsum">true</child2>
</element>

我想要返回的结果是一个包含以下标题的列表:

Hello world
Hello world 3

第二个元素标题为&#34; Hello world 2&#34;因为缺少这个子元素而被排除在外:

<child2 attr="ipsum">true</child2>

任何提示?

1 个答案:

答案 0 :(得分:0)

部分问题是ipsum不是您发布的xml中的属性。它是属性attr的值。另一个例子是如果你说<child2 name="John"></child2>。在这种情况下,name是属性,John是该属性的值。如果您尝试维护当前的xml结构,则以下代码应该有效:

import xml.etree.ElementTree as ET
tree = ET.parse('elements.xml')
root = tree.getroot()

for element in root:
    childEl = element.find('child2')
    if childEl != None and childEl.text == "true":
        if element.find('title') != None:
            print element.find('title').text

它循环遍历元素,检查child2元素以确保它存在,以及该元素的文本值是否为&#34; true&#34;。

如果您希望代码的行为方式与ipsum设置为true的方式相同,那么您可以使用以下代码和xml示例:

<?xml version="1.0"?>
<data>
    <element>
        <title>Hello world</title>
        <child1>Lorem</child1>
        <child2 ipsum="true"></child2>
    </element>
    <element>
        <title>Hello world 2</title>
        <child1>Lorem</child1>
    </element>
    <element>
        <title>Hello world 3</title>
        <child1>Lorem</child1>
        <child2 ipsum="true"></child2>
    </element>    
</data>

import xml.etree.ElementTree as ET
tree = ET.parse('elements.xml')
root = tree.getroot()

for element in root:
    childEl = element.find('child2')
    if childEl != None and childEl.get("ipsum") == "true":
        if element.find('title') != None:
            print element.find('title').text

希望这有帮助!如果有任何您希望我澄清的话,请告诉我。