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
相关产品推荐
相关产品推荐

