如何使用 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)
所以我有一个 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)