来自/ tostring的Round-tripping Python的ElementTree会删除名称空间

时间:2018-05-21 17:05:57

标签: python xml xml-namespaces elementtree

我有一个我想要构建的基本XML字符串,所以我要做的第一件事就是将XML字符串解析为etree。

然而,它看起来像其他命名空间" d"和" m"被忽略了。我可以成功地将字符串解析为XML Element

import xml.etree.ElementTree as ET
BASE = """<?xml version="1.0" encoding="utf-8" ?>
<feed
  xml:base="https://www.nuget.org/api/v2/"
  xmlns="http://www.w3.org/2005/Atom"
  xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
  xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
>
</feed>
"""
a = ET.fromstring(BASE)
# <Element '{http://www.w3.org/2005/Atom}feed' at 0x000002264B03F778>

但是当我们将返回转换为字符串时,我们会删除&#34; d&#34;和&#34; m&#34;命名空间:

ET.tostring(a)
# Formatted manually for StackOverflow
# b'<ns0:feed
#    xmlns:ns0="http://www.w3.org/2005/Atom"
#    xml:base="https://www.nuget.org/api/v2/">
# </ns0:feed>'

那么这里发生了什么?

1 个答案:

答案 0 :(得分:0)

似乎删除了未使用的命名空间。如果您将BASE更改为以下内容:

BASE = """<?xml version="1.0" encoding="utf-8" ?>
<feed
  xml:base="https://www.nuget.org/api/v2/"
  xmlns="http://www.w3.org/2005/Atom"
  xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
  xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
>
  <m:properties>
    <d:Id>NuGetTest</d:Id>
  </m:properties>
</feed>
"""

您将看到缺少的名称空间:

>>> et.tostring(a)
b'<ns0:feed
   xmlns:ns0="http://www.w3.org/2005/Atom"
   xmlns:ns1="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
   xmlns:ns2="http://schemas.microsoft.com/ado/2007/08/dataservices"
   xml:base="http://localhost:40221/nuget">
     <ns1:properties>
       <ns2:Id>NuGetTest</ns2:Id>
     </ns1:properties>
</ns0:feed>'

请注意,命名空间会发生变化:d变为ns2m变为ns1。我不确定Python是如何做到这一点的,但看起来它只是基于首先使用的。