我有一个我想要构建的基本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>'
那么这里发生了什么?
答案 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
变为ns2
,m
变为ns1
。我不确定Python是如何做到这一点的,但看起来它只是基于首先使用的。