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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:27:03