You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:18:21