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

如何结合Pydantic处理XML数据?

用Pydantic处理带命名空间与属性的XML解决方案

核心方案:xmltodict预处理 + Pydantic映射

先通过xmltodict将XML转成字典,针对性处理命名空间和@前缀的属性,再映射到Pydantic模型,是最直接的解决路径。

步骤1:XML转字典时简化格式

xmltodict默认会给属性加@前缀、保留命名空间前缀,可通过参数直接优化:

import xmltodict
from pydantic import BaseModel

# 示例XML(替换成你的实际内容)
xml_str = """
<root xmlns="http://your-namespace.com">
    <product sku="PROD001">
        <title>Sample Product</title>
    </product>
</root>
"""

# 转换时去掉属性@前缀,清除命名空间
parsed_dict = xmltodict.parse(
    xml_str,
    attr_prefix='',  # 移除属性的@前缀
    process_namespaces=True,
    namespaces={'http://your-namespace.com': None}  # 清空指定命名空间
)

步骤2:定义匹配的Pydantic模型

根据处理后的字典结构写模型,嵌套层级要对应:

class Product(BaseModel):
    sku: str
    title: str

class Root(BaseModel):
    product: Product

# 直接解析字典
root = Root(**parsed_dict['root'])
print(root.product.sku)  # 输出 PROD001

手动清理字典(应对复杂场景)

如果xmltodict的参数不足以处理特殊命名空间规则,手动遍历字典清理:

def clean_xml_dict(raw_dict):
    cleaned = {}
    for key, value in raw_dict.items():
        # 移除命名空间前缀(比如 {http://xx}key → key)
        if '{' in key:
            key = key.split('}')[-1]
        # 移除属性的@前缀(如果没在parse时处理)
        if key.startswith('@'):
            key = key[1:]
        # 递归处理嵌套字典
        if isinstance(value, dict):
            value = clean_xml_dict(value)
        cleaned[key] = value
    return cleaned

# 先转原始字典,再清理
raw_parsed = xmltodict.parse(xml_str)
cleaned_data = clean_xml_dict(raw_parsed)
root = Root(**cleaned_data['root'])

更省心的替代:用pydantic-xml库

专门适配Pydantic的XML解析库,直接支持命名空间、属性映射,无需手动转字典:

from pydantic_xml import BaseXmlModel, element, attr

class Product(BaseXmlModel):
    sku: str = attr(name='sku')  # 映射XML属性
    title: str = element(name='title')  # 映射XML元素

class Root(BaseXmlModel, tag='root', ns='http://your-namespace.com'):
    product: Product

# 直接从XML字符串解析
root = Root.from_xml(xml_str)
print(root.product.title)  # 输出 Sample Product

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 15:39:36