Как сохранить пространства имен при разборе xml через ElementTree в Python - PullRequest
0 голосов
/ 30 января 2019

Предположим, что у меня есть следующий XML, который я хочу изменить с помощью Python ElementTree:

<root xmlns:prefix="URI">
  <child company:name="***"/>
  ...
</root> 

Я выполняю некоторые изменения в XML-файле, например:

import xml.etree.ElementTree as ET
tree = ET.parse('filename.xml')
# XML modification here
# save the modifications
tree.write('filename.xml')

Тогда XML-файл выглядит следующим образом:

<root xmlns:ns0="URI">
  <child ns0:name="***"/>
  ...
</root>

Как видите, пространство имен prefix изменилось на ns0.Я знаю об использовании ET.register_namespace() как упоминалось здесь .

Проблема с ET.register_namespace() заключается в том, что:

  1. Вам необходимо знать prefixи URI
  2. Он не может использоваться с пространством имен по умолчанию.

например, если XML выглядит так:

<root xmlns="http://uri">
    <child name="name">
    ...
    </child>
</root>

Он будет преобразован во что-тонапример:

<ns0:root xmlns:ns0="http://uri">
    <ns0:child name="name">
    ...
    </ns0:child>
</ns0:root>

Как видите, пространство имен по умолчанию изменено на ns0.

Есть ли способ решить эту проблему с помощью ElementTree?

1 Ответ

0 голосов
/ 02 февраля 2019

Вот способ сохранить префикс и URI пространств имен:

def register_all_namespaces(filename):
    namespaces = dict([node for _, node in ET.iterparse(filename, events=['start-ns'])])
    for ns in namespaces:
        ET.register_namespace(ns, namespaces[ns])

Этот метод следует вызывать перед вызовом метода [ET].write().

...