如何解析XML内部嵌套数据?附含CDATA区块的record标签示例
解析该嵌套XML记录的方法
该XML为双层嵌套结构:外层是custom.model的业务记录,email_body字段通过CDATA包裹了第二层业务XML数据,避免内层标签被外层解析器误处理,解析可按以下步骤进行:
步骤1:解析外层XML
直接使用通用XML解析库处理外层结构即可,需要注意你提供的示例中外层<record>的model属性缺少闭合引号,实际解析前要先修正语法问题,避免解析报错。
以Python的xml.etree.ElementTree为例:
import xml.etree.ElementTree as ET # 加载外层XML内容 outer_xml = """你的完整XML字符串""" root = ET.fromstring(outer_xml) # 提取外层普通字段 record_id = root.attrib.get("id") model = root.attrib.get("model") name = root.find("field[@name='name']").text email_from = root.find("field[@name='email_from']").text # 其他外层字段按照相同逻辑提取即可
步骤2:解析CDATA中的内层XML
提取到email_body字段的内容后,CDATA包裹的内容本身就是格式完整的XML,直接将其作为新的XML对象解析即可:
# 提取email_body的CDATA内容 email_body_content = root.find("field[@name='email_body']").text.strip() # 解析内层XML inner_root = ET.fromstring(email_body_content) # 提取内层业务字段 process = inner_root.find("field[@name='process']").text target_model = inner_root.find("field[@name='model']").text company_name = inner_root.find("field[@name='name']").text currency_id = inner_root.find("field[@name='currency_id']").text
注意事项
- CDATA本身的作用就是避免内层XML标签被转义,无需手动处理内容中的尖括号,直接提取内容解析即可
- 若CDATA内容前后存在多余空白或换行,解析前调用
strip()处理即可避免解析异常 - 如果该XML是Odoo框架中的数据记录,可直接使用Odoo自带的
odoo.tools.convert.parse_record工具解析,框架会自动处理嵌套的XML结构
内容的提问来源于stack exchange,提问作者Kai Ning
相关产品推荐
相关产品推荐

