python - 使用 ElementTree 提取子 XML,忽略命名空间

标签 python xml xml-parsing elementtree

我有以下 XML,如果名称与“Adam”匹​​配,我想提取 child 的一部分

<data>
    <a:config version="1.0" xmlns:a="uri:abc.com/a" xmlns:b="uri:abc.com/b">
  <a:xxx config="ABC">
      <set>option_on</set>
      <location>/123/123</location>
      <data>123</data>
  </a:xxx>
<a:xxx name="Adam">
  <a:yyy value="5555-5555">
    <log>true</log>
  </a:yyy>
</a:xxx>
  <a:xxx name="Lisa">
    <a:yyy value="2222-2222">
      <log>false</log>
    </a:yyy>
  </a:xxx>
</a:config>
</data>

我设法提取该部分,但它没有输出原始 namespace ,而是显示 ns0 和 ns1。下面是我的代码

import xml.etree.ElementTree as ET
tree2 = ET.parse("mycode.xml")
root2= tree2.getroot()
for elem in tree2.iter(tag='{uri:abc.com/a}xxx'):
  match = elem.get('name')
  if match == "Adam":
    bla = ET.dump(elem)

输出如下:-

<ns0:xxx xmlns:ns0="uri:abc.com/a" name="Adam">
    <ns0:yyy value="5555-5555">
      <log>true</log>
    </ns0:yyy>
  </ns0:xxx>

我希望得到与原始文档完全相同的内容:-

<a:xxx name="Adam">
  <a:yyy value="5555-5555">
    <log>true</log>
  </a:yyy>
</a:xxx>

最佳答案

使用register_namespace功能。

import xml.etree.ElementTree as ET

tree2 = ET.parse("mycode.xml")
root2 = tree2.getroot()

# Register the 'a' prefix to be used when serializing
ET.register_namespace("a", "uri:abc.com/a")

for elem in tree2.iter(tag='{uri:abc.com/a}xxx'):
    match = elem.get('name')
    if match == "Adam":
        bla = ET.dump(elem)

输出:

<a:xxx xmlns:a="uri:abc.com/a" name="Adam">
  <a:yyy value="5555-5555">
    <log>true</log>
  </a:yyy>
</a:xxx>

这不是您要求的确切输出。您不能强制 ElementTree 省略 namespace 声明(因为这样做会导致输出格式错误)。

关于python - 使用 ElementTree 提取子 XML,忽略命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49257216/

相关文章:

python - BioPython:从 Blast 输出文件中提取序列 ID

python - 如何控制docxtpl中的spces和分页符(基于现有的docx模板)?

Python 使用递归反转字符串

xml - 使用 qooxdoo 编写 xml

java - 将 SOAP 消息转换为 Java 对象

android - 膨胀类 android.support.v7.widget.Toolbar 时出错

java - 在 Javax.xml.ws 服务上添加 XMLParserV2 jar 时发生冲突

java - 在 Java 中使用 DOM 解析 XML

python - 如何使用 Pandas 获取两个日期之间的天数

python - 如何在 Python 中每 60 秒异步执行一次函数?