Столкновение пространств имен с etree lxml

У меня проблема с пространством имен в lxml 2.3 и etree.

Например, у меня есть два узла с разными пространствами имен:

parent = etree.Element('{parent-space}parent')
child = etree.Element('{child-space}child')

После этого узел child добавляется к узлу parent:

parent.append(child)

Затем, если я использую метод tostring etree, я получаю следующий результат:

<ns0:parent xmlns:ns0="parent-space">
    <ns0:child xmlns:ns0="child-space"/>
</ns0:parent>

Оба пространства имен получают здесь метку ns0, поэтому они конфликтуют. Как я могу этого избежать?


person Martin    schedule 20.09.2012    source источник


Ответы (2)


Нет никакого столкновения. Префикс ns0 просто переопределяется для потомков <child>.

Этот XML-документ

<ns0:parent xmlns:ns0="parent-space">
    <ns0:child xmlns:ns0="child-space"/>
</ns0:parent>

эквивалентно

<ns0:parent xmlns:ns0="parent-space">
    <ns1:child xmlns:ns1="child-space"/>
</ns0:parent>

а также

<parent xmlns="parent-space">
    <child xmlns="child-space"/>
</parent>

что касается эффективных пространств имен parent и child.

Вы можете работать с nsmap для объявления префиксов. Эффективный результат тот же, но он выглядит менее запутанным при сериализации.

from lxml import etree

NS_MAP = {
    "p" : "http://parent-space.com/",
    "c" : "http://child-space.com/"
}
NS_PARENT = "{%s}" % NS_MAP["parent"]
NS_CHILD = "{%s}" % NS_MAP["child"]

parent = etree.Element(NS_PARENT + "parent", nsmap=NS_MAP)
child  = etree.SubElement(parent, NS_CHILD + "child")
child.text = "Some Text"

print etree.tostring(parent, pretty_print=True)

это печатает

<p:parent xmlns:p="http://parent-space.com/" xmlns:c="http://child-space.com/">
  <c:child>Some Text</c:child>
</p:parent>
person Tomalak    schedule 20.09.2012

Похоже на этот пост lxml.etree.tostring(element) не писать пространства имен в python? где предлагается использовать cleanup_namespaces

надеюсь, это поможет

person Community    schedule 20.09.2012
comment
Очистка пространств имен просто удаляет неиспользуемые пространства имен, но не переназначает пространства имен на уникальные имена. - person Martin; 20.09.2012