如何使用元素树

时间:2017-12-04 03:17:46

标签: python xml key-value

我目前正在使用Element Tree来解析一些XML,其中一些有多个重复的名称/值对,看起来像这样。我想要做的是提取感兴趣的元素,即性别=男性和颜色=红色,但由于结构的原因,我似乎无法使用它自己使用findall。 如何提取这些元素?我认为正确的逻辑是寻找一个子节点,我可以在其中找到child.text ='gender'等,然后继续打印出该子节点的名称/值。这样做的最佳方式是什么?

<a:characteristic>
    <name>gender</name>
    <value>male</value>
</a:characteristic>
<a:characteristic>
    <name>age</name>
    <value>30</value>
</a:characteristic>
<a:characteristic>
    <name>colour</name>
    <value>red</value>
</a:characteristic>
<a:characteristic>
    <name>language</name>
    <value>python</value>
</a:characteristic>         

1 个答案:

答案 0 :(得分:3)

我没有尝试处理XML文档结构来进行这种查询,而是创建一个更方便的数据结构来根据这种特征进行查询 - 一个字典使用特征名称作为键,将特征值作为值

类似的东西:

import xml.etree.ElementTree as ET

data = """<root xmlns:a="http://www.w3.org/2002/07/a#">
    <a:characteristic>
        <name>gender</name>
        <value>male</value>
    </a:characteristic>
    <a:characteristic>
        <name>age</name>
        <value>30</value>
    </a:characteristic>
    <a:characteristic>
        <name>colour</name>
        <value>red</value>
    </a:characteristic>
    <a:characteristic>
        <name>language</name>
        <value>python</value>
    </a:characteristic>        
</root>"""

namespaces = {'a': 'http://www.w3.org/2002/07/a#'} 
root = ET.fromstring(data)
characteristics = {
    item.findtext("name"): item.findtext("value")
    for item in root.findall('a:characteristic', namespaces)
}
print(characteristics)

打印:

{'gender': 'male', 'age': '30', 'colour': 'red', 'language': 'python'}

现在,获得gender值就像characteristics['gender']一样简单。