Python3使用ElementTree提取XML标签内容存为字符串的方法
Python ElementTree 提取XML指定标签内容实现方案
场景说明
- 运行环境:Python 3.7.2,使用标准库
xml.etree.ElementTree - 待处理文件为带默认命名空间的ISO 20022 pain.001格式XML,目标是提取
MsgId标签的文本内容,输出字符串类型,与原有minidom实现逻辑完全对齐 - 原有minidom参考逻辑:通过
getElementsByTagName递归遍历全文档匹配MsgId标签,读取标签内文本
待处理XML示例
<?xml version="1.0" encoding="UTF-8"?> <Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.003.03"> <CstmrCdtTrfInitn> <GrpHdr> <MsgId>nBblsUR-uH..6jmGgZNHLQAAAXgXN1Lu</MsgId> <CreDtTm>2016-11-10T12:00:00.000+01:00</CreDtTm> <NbOfTxs>1</NbOfTxs> <CtrlSum>6</CtrlSum> <InitgPty> <Nm>TC 03000 Kunde 55 Protokollr ckf hrung</Nm> </InitgPty> </GrpHdr> </CstmrCdtTrfInitn> </Document>
实现代码
注意:该XML根节点声明了默认命名空间,所有无前置前缀的标签都归属该命名空间,查找标签时必须传入命名空间映射,否则会匹配不到节点
import xml.etree.ElementTree as ET # 配置命名空间映射,前缀可自定义,value对应XML根节点声明的默认命名空间 ns_map = {"p": "urn:iso:std:iso:20022:tech:xsd:pain.001.003.03"} # 解析目标文件,路径规则和原有minidom逻辑保持一致 tree = ET.parse(f'H:\\app_python/in_spsh/{filename_string}') root = tree.getroot() # 递归查找全文档下所有MsgId节点,效果和minidom的getElementsByTagName完全一致 for msg_id_node in root.findall(".//p:MsgId", ns_map): msg_id_str = msg_id_node.text # 直接取text属性即为字符串类型的标签内容 print(msg_id_str)
简化写法
如果确认文档内仅存在一个MsgId节点,可以直接用find方法单次取值,不需要循环:
msg_id_str = root.find(".//p:MsgId", ns_map).text
常见踩坑
不要直接使用root.findall("MsgId")查找标签,未携带命名空间的查找语句无法匹配到属于默认命名空间下的节点,会返回空列表。
内容的提问来源于stack exchange,提问作者strtmster
相关产品推荐
相关产品推荐

