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