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

Python新手求助:使用minidom解析含CDATA的XML

解析嵌套在CDATA中的XML(minidom实现)

嘿,作为Python新手碰到这种嵌套在CDATA里的XML解析问题确实容易懵,我来帮你一步步搞定~

首先要明确:你拿到的XML里,目标数据被包裹在CDATA块里,而minidom默认不会解析CDATA内部的XML内容,所以我们需要分两步走:先提取CDATA中的XML字符串,再单独解析这段字符串。

步骤1:提取CDATA中的目标XML内容

假设你拿到的原始XML字符串是类似这样的(包含包裹目标XML的CDATA块):

raw_xml = '''<RootNode><![CDATA[<?xml version="1.0" encoding="UTF-8"?><UDSObjectList> <UDSObject> <Handle>cr:908715</Handle> <Attributes> <Attribute DataType="2002"> <AttrName>ref_num</AttrName> <AttrValue>497131</AttrValue> </Attribute> <Attribute DataType="2002"> <AttrName>support_level</AttrName> <AttrValue>Premium</AttrValue> </Attribute></Attributes></UDSObject></UDSObjectList>]]></RootNode>'''

我们先用minidom解析原始XML,定位并提取CDATA块里的内容:

from xml.dom import minidom

# 解析包含CDATA的原始XML
dom = minidom.parseString(raw_xml)

# 遍历节点找到CDATA块(CDATA在minidom里是CDATA_SECTION_NODE类型)
cdata_content = None
for node in dom.documentElement.childNodes:
    if node.nodeType == minidom.Node.CDATA_SECTION_NODE:
        cdata_content = node.data.strip()
        break

# 现在cdata_content就是CDATA里的完整XML字符串

步骤2:解析提取到的目标XML

拿到CDATA里的XML字符串后,就可以像解析普通XML一样处理它了:

# 解析目标XML
target_dom = minidom.parseString(cdata_content)

# 获取所有UDSObject节点
uds_objects = target_dom.getElementsByTagName('UDSObject')

# 遍历每个UDSObject提取数据
for obj in uds_objects:
    # 提取Handle值
    handle_tag = obj.getElementsByTagName('Handle')[0]
    handle = handle_tag.firstChild.nodeValue
    print(f"Handle: {handle}")
    
    # 提取所有Attribute的名称和值
    attributes = obj.getElementsByTagName('Attribute')
    for attr in attributes:
        attr_name = attr.getElementsByTagName('AttrName')[0].firstChild.nodeValue
        attr_value = attr.getElementsByTagName('AttrValue')[0].firstChild.nodeValue
        print(f"  * {attr_name}: {attr_value}")

关键注意点

  • 如果你的原始XML结构和示例不同(比如CDATA在特定标签下),需要调整查找CDATA节点的逻辑,比如先定位到包含CDATA的父标签,再在其子节点中找CDATA_SECTION_NODE。
  • 处理节点值时,要确保节点确实有firstChild(避免空节点报错),如果XML可能存在空值,可以加个判断:handle_tag.firstChild.nodeValue if handle_tag.firstChild else ""。

内容的提问来源于stack exchange,提问作者Dibu Escobedo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:27:05