如何使用 etree.write() 输出没有默认 ns 的 xml 文件?

how to use etree.write() to output a xml file that doesn't have default ns?

所以我有一个 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>

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

有时很难让 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)