如何用Python提取XML中CDATA内部的XML数据
解析嵌套在CDATA中的XML数据解决方案
问题分析
CDATA块在XML解析器中会被当作纯文本处理,因此直接遍历外层XML节点无法获取其内部的XML结构。需要先提取CDATA文本内容,再单独解析这部分内容为XML。
完整解决方案代码
import xml.etree.ElementTree as ElementTree # 解析外层XML文件 tree = ElementTree.parse('file.xml') root = tree.getroot() # 提取已实现的EventId event_id = root.find('.//EventId').text print(f"EventId: {event_id}") # 获取PAYLOAD节点下的CDATA文本,清理多余空白字符 payload_cdata = root.find('.//PAYLOAD').text.strip() # 将CDATA文本解析为XML树 payload_root = ElementTree.fromstring(payload_cdata) # 定位_Type为Phone的CONTACT_POINT节点 phone_contact = payload_root.find(".//CONTACT_POINT[@_Type='Phone']") if phone_contact: contact_type = phone_contact.get('_Type') contact_value = phone_contact.get('_Value') print(f"Phone Contact - Type: {contact_type}, Value: {contact_value}")
代码说明
- 提取CDATA内容:通过
root.find('.//PAYLOAD').text获取PAYLOAD节点下的文本(即CDATA内容),用strip()去除首尾多余的换行和空格。 - 解析CDATA内的XML:使用
ElementTree.fromstring()将纯文本格式的XML字符串转换为可操作的XML树结构。 - 定位目标节点:利用XPath表达式
".//CONTACT_POINT[@_Type='Phone']"直接筛选出_Type属性为Phone的CONTACT_POINT节点。 - 获取属性值:通过
.get()方法提取节点的_Type和_Value属性值。
测试输出
EventId: 122157660 Phone Contact - Type: Phone, Value: 1236573348
内容的提问来源于stack exchange,提问作者Sri Goverdhan Sam
相关产品推荐
相关产品推荐

