Имя тега lxml с ":" - PullRequest
       28

Имя тега lxml с ":"

6 голосов
/ 08 декабря 2011

Я пытаюсь создать дерево xml из объекта JSON, используя lxml.etree. Некоторые из тэгов содержат двоеточие, например: -

«настройки: текущие», которые я пытался использовать

'{settings} current' как имя тега, но я получаю это: -

ns0: текущие xmlns: ns0 = "настройки"

1 Ответ

8 голосов
/ 26 января 2012

Да, сначала прочитайте и поймите пространства имен XML.Затем используйте это для генерации XML-дерева с пространствами имен: u

>>> MY_NAMESPACES={'settings': 'http://example.com/url-for-settings-namespace'}
>>> e=etree.Element('{%s}current' % MY_NAMESPACES['settings'], nsmap=MY_NAMESPACES)
>>> etree.tostring(e)
'<settings:current xmlns:settings="http://example.com/url-for-settings-namespace"/>'

И вы можете комбинировать это с пространствами имен по умолчанию

>>> MY_NAMESPACES={'settings': 'http://example.com/url-for-settings-namespace', None:    'http://example.com/url-for-default-namespace'}
>>> r=etree.Element('my-root', nsmap=MY_NAMESPACES)
>>> d=etree.Element('{%s}some-element' % MY_NAMESPACES[None])
>>> e=etree.Element('{%s}current' % MY_NAMESPACES['settings'])
>>> d.append(e)
>>> r.append(d)
>>> etree.tostring(r)
'<my-root xmlns:settings="http://example.com/url-for-settings-namespace" xmlns="http://example.com/url-for-default-namespace"><some-element><settings:current/></some-element></my-root>'

Обратите внимание, что у вас должен быть элемент с nsmap=MY_NAMESPACES в вашей иерархии XML-дерева.Тогда все нисходящие узлы могут использовать это объявление.В вашем случае у вас нет этого бита, поэтому lxml генерирует имена пространств имен, такие как ns0

Кроме того, при создании нового узла используйте URI пространства имен для имени тега, а не имени пространства имен: {http://example.com/url-for-settings-namespace}current

...