Отключение ElementTree в Python из / tostring отбрасывает пространства имен - PullRequest
0 голосов
/ 21 мая 2018

У меня есть базовая XML-строка, из которой я хочу построить, поэтому первое, что я делаю, это синтаксический анализ XML-строки в etree.

Однако, это похоже на другие пространства имен "d"и" м "игнорируются.Я могу успешно разобрать строку в 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>

Но когда мы конвертируем обратно в строку, мы отбрасываем пространства имен "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>'

Так что здесь происходит?

1 Ответ

0 голосов
/ 21 мая 2018

Похоже, что неиспользуемые пространства имен отброшены.Если вы измените свой 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 делает это, но похоже, что он основан только на том, что используется первым.

...