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

pandas read_xml解析XML时匹配指定NIR值的XPath编写问题

问题背景

需要使用Python从XML文件提取信息,构造pandas DataFrame存储所有NIR标签文本匹配指定值时,关联的PrdRef节点信息。
待解析XML结构示例:

<Ressources xmlns="http://www.johndo.tr/brm">
...
<RessInd>
    <CdRet>01</CdRet>
    <NIR>456464644466</NIR>
    <DTO>01011988</DTO>
    <PrdRef>
        <PrdRefTyp>M</PrdRefTyp>
        <PrdRefVal>21M01</PrdRefVal>
        ...
    </PrdRef>
</RessInd>
<RessInd>
     ... etc
</RessInd>
</Ressources>

原有实现代码运行后要么报错要么返回空结果,无法得到预期的PrdRef数据:

import pandas as pd

df_prdref = pd.read_xml("to_parse.xml",xpath="//data:PrdRef/../data:RessInd/data:NIR[text()='456464644466']",namespaces={"data": "http://johndo.tr/brm"})
print(df_prdref )
故障原因
  • 命名空间配置错误:XML根节点声明的默认命名空间为http://www.johndo.tr/brm,原代码中命名空间缺失www.前缀,会导致所有节点匹配失败
  • XPath逻辑错误:原路径层级颠倒,PrdRef的父节点就是RessInd,不存在PrdRef/../RessInd下再查找RessInd节点的逻辑
  • 目标节点定位错误:pd.read_xml()会将xpath参数最终定位到的每个节点作为DataFrame的一行,原写法最终定位到NIR节点,自然无法返回PrdRef下的字段数据
正确实现代码
import pandas as pd

# 命名空间必须和XML声明完全一致
ns = {"data": "http://www.johndo.tr/brm"}
target_nir = "456464644466"

# XPath逻辑:筛选所有父级RessInd节点下NIR值等于目标值的PrdRef节点
df_prdref = pd.read_xml(
    "to_parse.xml",
    xpath=f"//data:PrdRef[../data:NIR/text()='{target_nir}']",
    namespaces=ns
)

print(df_prdref)

如果需要在结果中同时保留NIR、CdRet、DTO等RessInd层级的关联字段,可以将XPath调整为定位符合NIR匹配条件的RessInd节点,再解析嵌套的PrdRef内容即可,示例写法:

df_ressind = pd.read_xml(
    "to_parse.xml",
    xpath=f"//data:RessInd[data:NIR/text()='{target_nir}']",
    namespaces=ns,
    elems_only=True
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 08:33:24