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
相关产品推荐
相关产品推荐

