我目前正在使用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>
答案 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']
一样简单。