如何使用lxml修改XML中的子元素标签名称
使用lxml修改XML标签名称
要把XML里的<CtgyPurp>标签改成<newName>,核心是定位目标元素后修改它的tag属性,同时要注意处理原XML的命名空间(避免新标签脱离原结构约束),具体操作步骤和代码如下:
1. 导入lxml模块
from lxml import etree
2. 解析XML内容
支持解析字符串或本地文件,这里以字符串为例:
xml_content = """<?xml version='1.0' encoding='UTF-8'?> <Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <CstmrCdtTrfInitn> <CtgyPurp> <Cd>SALA</Cd> </CtgyPurp> </CstmrCdtTrfInitn> </Document> """ root = etree.fromstring(xml_content)
3. 定位目标标签(处理命名空间)
原XML带有命名空间,必须通过命名空间映射才能准确找到元素:
# 定义命名空间映射,key可自定义,value是原XML的xmlns属性值 ns = {'pain': 'urn:iso:std:iso:20022:tech:xsd:pain.001.001.03'} # 查找目标标签(如果有多个可改用findall) target_element = root.find('.//pain:CtgyPurp', namespaces=ns)
4. 修改标签名称
必须保留原命名空间,否则新标签会脱离原XML的命名空间规则,两种实现方式:
# 方式1:直接拼接带命名空间的标签名 target_element.tag = f"{{{ns['pain']}}}newName" # 方式2:用QName类更规范(推荐) new_qname = etree.QName(ns['pain'], 'newName') target_element.tag = new_qname
5. 输出修改后的XML
# 格式化输出,保留XML声明和缩进 modified_xml = etree.tostring( root, encoding='UTF-8', pretty_print=True, xml_declaration=True ).decode('UTF-8') print(modified_xml)
执行后,原XML的<CtgyPurp>会被替换为<newName>,内部的<Cd>SALA</Cd>内容保持不变,同时保留原命名空间结构。
内容的提问来源于stack exchange,提问作者saro
相关产品推荐
相关产品推荐

