从 python 中的 XML 字符串中删除名称空间和节点

Remove namespaces and nodes from XML string in python

我从 post 请求中得到一个 xml 字符串,我需要在后续请求中使用这个 xml。我需要编辑第一个请求中的 XML 以反映后续请求的正确格式。 我可以成功删除名称空间,但我正在努力提取所需的节点并保持 xml 格式。


当前格式

<?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>

所需格式

<?xml version="1.0" encoding="UTF-8"?>
<DataMap xmlns="" sourceType="0">
  <FieldMap flag="Q1" destination="Q1_1" source="Q1_1"/>
  <FieldMap flag="Q1" destination="Q1_1" source="Q1_1"/>
</DataMap>

--删除命名空间

dmXML = xmlstring

 from lxml import etree
    root = etree.fromstring(dmXML)

    for elem in root.getiterator():
        elem.tag = etree.QName(elem).localname
    etree.cleanup_namespaces(root)
    test = etree.tostring(root).decode()
print(test)

--提取所需的节点但进入数据框更改格式

xdf = pandas.read_xml(dmXML, xpath='.//DataMap/*', namespaces={"doc": "http://www.w3.org/2001/XMLSchema"})
   xml = pandas.DataFrame.to_xml(xdf)

您可以简单地将相关部分提取到新文档中:

import xml.etree.ElementTree as ET
root = ET.fromstring(dmXML)
new_root = root.find('.//DataMap')
print(ET.tostring(new_root, xml_declaration=True, encoding='UTF-8').decode())

输出:

<?xml version='1.0' encoding='UTF-8'?>
<DataMap sourceType="0">
          <FieldMap flag="Q1" destination="Q1_1" source="Q1_1" />
          <FieldMap flag="Q1" destination="Q1_1" source="Q1_1" />
        </DataMap>