Python模块xml.etree.ElementTree自动修改xml名称空间键 [英] Python module xml.etree.ElementTree modifies xml namespace keys automatically

查看:89
本文介绍了Python模块xml.etree.ElementTree自动修改xml名称空间键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我注意到python ElementTree模块在以下简单示例中更改了xml数据:

I've noticed that python ElementTree module, changes the xml data in the following simple example :

import xml.etree.ElementTree as ET
tree = ET.parse("./input.xml")
tree.write("./output.xml")

我不会期望它会更改,因为我已经完成了简单的读写测试,没有进行任何修改。但是,结果显示了一个不同的故事,尤其是在名称空间索引中(普通–-ns0,d3p1-> ns1,i-> ns2):

I wouldn't expect it to change, as I've done simple read and write test without any modification. however, the results shows a different story, especially in the namespace indices (nonage --> ns0 , d3p1 --> ns1 , i --> ns2 ) :

<?xml version="1.0" encoding="utf-8"?>
<ServerData xmlns:i="http://www.a.org" xmlns="http://schemas.xxx/2004/07/Server.Facades.ImportExport">
<CreationDate>0001-01-01T00:00:00</CreationDate>
<Processes>
    <Processes xmlns:d3p1="http://schemas.datacontract.org/2004/07/Management.Interfaces">
        <d3p1:ProtectedProcess>
            <d3p1:Description>/Applications/Safari.app/Contents/MacOS/Safari</d3p1:Description>
            <d3p1:DiscoveredMachine i:nil="true" />
            <d3p1:Id>0</d3p1:Id>
            <d3p1:Name>/applications/safari.app/contents/macos/safari</d3p1:Name>
            <d3p1:Path>/Applications/Safari.app/Contents/MacOS/Safari</d3p1:Path>
            <d3p1:ProcessHashes xmlns:d5p1="http://schemas.datacontract.org/2004/07/Management.Interfaces.WildFire" />
            <d3p1:Status>1</d3p1:Status>
            <d3p1:Type>Protected</d3p1:Type>
        </d3p1:ProtectedProcess>
    </Processes>
</Processes>

<ns0:ServerData xmlns:ns0="http://schemas.xxx/2004/07/Server.Facades.ImportExport" xmlns:ns1="http://schemas.datacontract.org/2004/07/Management.Interfaces" xmlns:ns2="http://www.a.org">
<ns0:CreationDate>0001-01-01T00:00:00</ns0:CreationDate>
<ns0:Processes>
    <ns0:Processes>
        <ns1:ProtectedProcess>
            <ns1:Description>/Applications/Safari.app/Contents/MacOS/Safari</ns1:Description>
            <ns1:DiscoveredMachine ns2:nil="true" />
            <ns1:Id>0</ns1:Id>
            <ns1:Name>/applications/safari.app/contents/macos/safari</ns1:Name>
            <ns1:Path>/Applications/Safari.app/Contents/MacOS/Safari</ns1:Path>
            <ns1:ProcessHashes />
            <ns1:Status>1</ns1:Status>
            <ns1:Type>Protected</ns1:Type>
        </ns1:ProtectedProcess>
    </ns0:Processes>
</ns0:Processes>

推荐答案

在使用 ElementTree 注册xml的名称空间以及它们的前缀。 docs.python.org/2/library/xml.etree.elementtree.html#xml.etree.ElementTree.register_namespace rel = noreferrer> ElementTree.register_namespace 功能。示例-

You would need to register the namespaces for your xml as well as their prefixes with ElementTree before reading/writing the xml using ElementTree.register_namespace function. Example -

import xml.etree.ElementTree as ET

ET.register_namespace('','http://schemas.xxx/2004/07/Server.Facades.ImportExport')
ET.register_namespace('i','http://www.a.org')
ET.register_namespace('d3p1','http://schemas.datacontract.org/2004/07/Management.Interfaces')

tree = ET.parse("./input.xml")
tree.write("./output.xml")

如果没有此元素树,则为相应的命名空间创建自己的前缀,即

Without this ElementTree creates its own prefixes for the corresponding namespaces, which is what happens for your case.

这在文档-


xml.etree。 ElementTree.register_namespace(prefix,uri)

xml.etree.ElementTree.register_namespace(prefix, uri)

注册名称空间前缀。该注册表是全局注册表,并且将删除给定前缀或名称空间URI的所有现有映射。 prefix是名称空间前缀。 uri是一个名称空间uri。 如果可能的话,此命名空间中的标记和属性将使用给定的前缀序列化。

Registers a namespace prefix. The registry is global, and any existing mapping for either the given prefix or the namespace URI will be removed. prefix is a namespace prefix. uri is a namespace uri. Tags and attributes in this namespace will be serialized with the given prefix, if at all possible.

(强调我的)

这篇关于Python模块xml.etree.ElementTree自动修改xml名称空间键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆