Есть ли способ зарегистрировать несколько пространств имен, используя ElementTree - PullRequest
1 голос
/ 05 марта 2020

Согласно документации, кажется, что одновременно может быть зарегистрировано только одно пространство имен.

xml .etree.ElementTree.register_namespace (префикс, uri)

Регистрирует префикс пространства имен. Реестр является глобальным, и все существующие сопоставления для данного префикса или URI пространства имен будут удалены. prefix - это префикс пространства имен. uri - это пространство имен uri. Теги и атрибуты в этом пространстве имен будут сериализованы с заданным префиксом, если это вообще возможно.

Но мне было бы любопытно, если кто-нибудь знает как-нибудь обойти это? Если нет ничего разумного, я переключусь на l xml.

1 Ответ

1 голос
/ 06 марта 2020

Вы можете зарегистрировать более одного пространства имен, только не в одном вызове register_namespace ().

Вы должны будете сделать отдельные вызовы для register_namespace () для каждого пространства имен.

Пример ...

import xml.etree.ElementTree as ET

ns_map = {"foo": "urn::foo",
          "bar": "urn::bar"}

for prefix, uri in ns_map.items():
    ET.register_namespace(prefix, uri)

root = ET.Element(ET.QName(ns_map["foo"], "root"))
ET.SubElement(root, ET.QName(ns_map["bar"], "child"))

print(ET.tostring(root).decode())

Печать ...

<foo:root xmlns:bar="urn::bar" xmlns:foo="urn::foo"><bar:child /></foo:root>

Также ...

Если в этом нет ничего разумного, я переключусь на l xml.

Я бы все равно переключился на l xml , : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...