DOM树结构中按标签名和属性解析XML时无法获取子节点求助
XML子节点访问与属性提取解决方案
你遇到的核心问题是XML解析时会将换行、缩进等空白字符解析为文本节点,导致直接通过childNodes或.item()获取子节点时,拿到的可能不是目标元素节点。以下是两种可行的解决方法:
方法一:使用xml.dom.minidom(适配.item()需求)
通过过滤非元素节点,或确定目标节点的索引来访问子节点,再提取V属性值:
from xml.dom import minidom xml_content = """<Ws> <Id V='862631039910699'> <Dt V='08/07/22;11/25'> <T V='24.3;24.3;24.3'/> <H V='98.0;98.0;98.0'/> <W V='1.3;272'/> <G V='25;2.4'/> <A V='0.00;468;472;471'/> <D V='0.00;8.9;8.065;0.0000;0.0000'/> </Dt> </Id> </Ws>""" # 解析XML dom = minidom.parseString(xml_content) root = dom.documentElement ### 方式1:过滤空白节点(更可靠) # 获取Id节点 id_node = None for node in root.childNodes: if node.nodeType == node.ELEMENT_NODE: id_node = node break if id_node: # 提取Id的V属性 print(f"Id的V值:{id_node.getAttribute('V')}") # 获取Dt节点 dt_node = None for node in id_node.childNodes: if node.nodeType == node.ELEMENT_NODE: dt_node = node break if dt_node: print(f"Dt的V值:{dt_node.getAttribute('V')}") # 遍历Dt下所有子节点的V属性 for child in dt_node.childNodes: if child.nodeType == child.ELEMENT_NODE: print(f"{child.tagName}的V值:{child.getAttribute('V')}") ### 方式2:直接用.item()指定索引(需确认空白节点位置) # 根节点下第2个节点(索引1)是Id节点 id_node = root.childNodes.item(1) print(f"Id的V值:{id_node.getAttribute('V')}") # Id节点下第2个节点(索引1)是Dt节点 dt_node = id_node.childNodes.item(1) print(f"Dt的V值:{dt_node.getAttribute('V')}") # Dt节点下第2个节点(索引1)是T节点 t_node = dt_node.childNodes.item(1) print(f"T的V值:{t_node.getAttribute('V')}")
方法二:使用xml.etree.ElementTree(更简洁直观)
无需处理空白节点,直接通过标签名查找节点并提取属性:
import xml.etree.ElementTree as ET root = ET.fromstring(xml_content) # 获取Id节点的V属性 id_node = root.find('Id') print(f"Id的V值:{id_node.get('V')}") # 获取Dt节点的V属性 dt_node = id_node.find('Dt') print(f"Dt的V值:{dt_node.get('V')}") # 遍历Dt下所有子节点的V属性 for child in dt_node: print(f"{child.tag}的V值:{child.get('V')}")
关键说明
- 用
minidom时,必须区分元素节点和文本节点(空白字符),否则.item()会取到无效节点; ElementTree的find()和get()方法会自动忽略空白节点,使用起来更高效。
内容的提问来源于stack exchange,提问作者Prakhar Tewari
相关产品推荐
相关产品推荐

