xml.dom.minidom如何提取指定属性值标签下的子标签内容
xml.dom.minidom 提取指定属性节点下子标签内容实现方法
问题场景
现有如下XML结构:
<animals> <pet type="dog"> <name>Jack</name> <name>Benny</name> <name>Will</name> </pet> <pet type="cat"> <name>Luna</name> <name>Lilith</name> <name>Willow</name> </pet> <pet type="rabbit"> <name>Lilly</name> <name>Robin</name> </pet> </animals>
需要仅提取type属性值为dog的<pet>标签下所有<name>子标签的内容,即Jack、Benny、Will三个值,要求仅使用xml.dom.minidom库实现,不引入ElementTree。
原有错误代码运行后会输出所有宠物名称,问题在于提前在全文档范围获取了所有name节点集合,遍历匹配到dog类型pet时,循环的仍然是全文档的name节点,没有做范围限定。
原有错误代码:
name = file.getElementsByTagName('name') pets = file.getElementsByTagName('pet') for i in pets: if (i.attributes['type'].value == "dog"): for j in name: print(j.firstChild.data)
修正方案
核心逻辑:getElementsByTagName是DOM节点的实例方法,调用者是哪个节点,查找范围就会被限定在该节点的子树范围内。不需要提前全局获取name节点,等匹配到type="dog"的pet节点后,再在该pet节点上调用方法查找内部的name节点即可。
修正后可直接运行的代码:
from xml.dom import minidom # 替换为你的XML文件实际路径 doc = minidom.parse("animals.xml") # 获取所有pet节点 pet_nodes = doc.getElementsByTagName("pet") for pet in pet_nodes: # 匹配type属性为dog的pet节点,用getAttribute取属性更稳妥,属性不存在时返回None不会抛KeyError if pet.getAttribute("type") == "dog": # 仅在当前dog类型pet节点范围内查找name子节点 name_nodes = pet.getElementsByTagName("name") for name in name_nodes: # 提取标签文本输出 print(name.firstChild.data)
运行输出结果:
Jack Benny Will
内容的提问来源于stack exchange,提问作者Kim
相关产品推荐
相关产品推荐

