我当前正在使用元素树来解析一些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>

最佳答案

我不会尝试处理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']一样容易。

关于python - 如何使用元素树测试XML节点是否具有特定字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47626019/

10-14 19:02
查看更多