Python处理XML字符串:移除命名空间、提取指定节点并保留原格式
你之前走pandas转DataFrame再转回XML的逻辑会把XML节点解析为表格结构,转回XML时会自动生成默认根节点、行节点,必然破坏原有结构,完全不需要走这个流程,直接用lxml原生的节点查找和输出能力即可实现需求,完整代码如下:
from lxml import etree # 你通过POST请求拿到的原始XML字符串 dmXML = """<?xml version="1.0" encoding="UTF-8"?> <soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <GetExResponse xmlns="http://www.someurl.com/"> <GetExResult> <DataMap xmlns="" sourceType="0"> <FieldMap flag="Q1" destination="Q1_1" source="Q1_1"/> <FieldMap flag="Q1" destination="Q1_1" source="Q1_1"/> </DataMap> </GetExResult> </GetExResponse> </soap:Body> </soap:Envelope>""" # 沿用你已验证可用的命名空间移除逻辑 root = etree.fromstring(dmXML.encode("UTF-8")) for elem in root.getiterator(): # 跳过注释等特殊节点 if not isinstance(elem.tag, str): continue elem.tag = etree.QName(elem).localname etree.cleanup_namespaces(root) # 直接定位目标DataMap节点 data_map_node = root.find(".//DataMap") if data_map_node is not None: # 直接输出节点,指定xml声明、编码和格式化参数 result_xml = etree.tostring( data_map_node, encoding="UTF-8", xml_declaration=True, pretty_print=True ).decode("UTF-8") print(result_xml)
输出结果完全匹配你期望的格式,会保留原节点的所有属性、子节点层级和缩进格式,不会产生多余改动。
内容的提问来源于stack exchange,提问作者vailingEight
相关产品推荐
相关产品推荐

