У меня есть базовая XML-строка, из которой я хочу построить, поэтому первое, что я делаю, это синтаксический анализ XML-строки в etree.
Однако, это похоже на другие пространства имен "d"и" м "игнорируются.Я могу успешно разобрать строку в XML Element:
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>
Но когда мы конвертируем обратно в строку, мы отбрасываем пространства имен "d" и "m":
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>'
Так что здесь происходит?
Похоже, что неиспользуемые пространства имен отброшены.Если вы измените свой BASE на что-то вроде этого:
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 делает это, но похоже, что он основан только на том, что используется первым.
d
ns2
m
ns1