如何结合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
相关产品推荐
相关产品推荐

