【问题标题】:how to use etree.write() to output a xml file that doesn't have default ns?如何使用 etree.write() 输出没有默认 ns 的 xml 文件?
【发布时间】:2015-10-02 08:50:58
【问题描述】:

所以我有一个需要更改的 xml 文件。修改后,我想将新内容写入一个新文件,output.xml。我使用了 write() 方法,但每行前面都有很多 ns#。我想出了如何通过使用 _namespace_map 摆脱所有这些 ns#,但是如何保留以前的 xmlns?比如原来的xml文件是:

<?xml version='1.0' encoding='UTF-8'?>

<server xmlns="urn:jboss:domain:1.2">

    <extensions>
    </extensions>

    <profile>
        <subsystem xmlns="urn:jboss:domain:logging:1.1">
        </subsystem>
        <subsystem xmlns="urn:jboss:domain:ee:1.0">
        </subsystem>
    </profile>

</server>

目前我得到了什么:

<ns0:server xmlns:ns0="urn:jboss:domain:1.2" xmlns:ns1="urn:jboss:domain:logging:1.1" xmlns:ns2="urn:jboss:domain:ee:1.0">

    <ns0:extensions>
    </ns0:extensions>

    <ns0:profile>
        <ns1:subsystem>
        </ns1:subsystem>
        <ns2:subsystem>
        </ns2:subsystem>
    </ns0:profile>

</ns0:server>

我真正想在 output.xml 中有什么:

<?xml version='1.0' encoding='UTF-8'?>

<server xmlns="urn:jboss:domain:1.2">

    <extensions>
    </extensions>

    <profile>
        <subsystem xmlns="urn:jboss:domain:logging:1.1">
        </subsystem>
        <subsystem xmlns="urn:jboss:domain:ee:1.0">
        </subsystem>
    </profile>

</server>

我没有显示我在标签中修改的内容,因为它与我的问题并不真正相关。谢谢!

【问题讨论】:

  • 顺便说一句,您应该使用register_namespace,而不是_namespace_map,它在Python 2.7 中可用。
  • @mzjn 我试过 register_namespace。如果您有多个 xmlns,则它不起作用。如果我这样做,则 register_namespace("", "urn:jboss:domain:logging:1.1"),然后 register_namespace("", "urn:jboss:domain:ee:1.0"),第一个将被覆盖。这样我就没有 ns2,但仍然有 ns0 和 ns1。
  • 是的,您不能将相同的前缀(在本例中为“空前缀”)分配给两个不同的命名空间 URI。我不认为这会奏效。
  • 是的,我认为这有点像映射的东西。因此,我使用了 _namespace_map,它使用 ns URI 作为键,前缀作为值。

标签: python-2.7 xml-parsing elementtree


【解决方案1】:

有时很难让 ElementTree 的行为完全符合要求。我的建议是尽可能使用lxml

lxml 是一个类似于 ElementTree 的库,但功能更多。它与命名空间声明无关。

此代码解析原始 XML 并将其几乎未更改地写入新文件:

from lxml import etree

doc = etree.parse("original.xml")
etree.ElementTree(doc.getroot()).write("out.xml",
                                       encoding="UTF-8",
                                       xml_declaration=True)

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 2020-09-22
    相关资源
    最近更新 更多