2016-10-22 4 views
0

Мне нужно создать XML, который выглядит следующим образом:Генерация XML с LXML - атрибут пространства имен

<definitions xmlns:ex="http://www.example1.org" xmlns="http://www.example2.org"> 
    <typeRef xmlns:ns2="xyz">text</typeRef> 
</definitions> 

Мой код выглядит следующим образом:

class XMLNamespaces: 
    ex = 'http://www.example1.org' 
    xmlns = 'http://www.example2.org' 

root = Element('definitions', xmlns='http://www.example2.org', nsmap = {'ex':XMLNamespaces.ex}) 
type_ref = SubElement(root, 'typeRef') 
type_ref.attrib[QName(XMLNamespaces.xmlns, 'ns2')] = 'xyz' 
type_ref.text = 'text' 

tree = ElementTree(root) 
tree.write('filename.xml', pretty_print=True) 

Результат выглядит следующим образом:

<definitions xmlns:ex="http://www.example1.org" xmlns="http://www.example2.org"> 
    <typeRef xmlns:ns0="http://www.example2.org" ns0:ns2="xyz">text</typeRef> 
</definitions> 

Итак, вот мой вопрос:

Как сделать атрибут похожим на xmlns: ns2 = "xyz" вместо xmlns: ns0 = "http://www.example2.org" ns0: ns2 = "xyz"?

ответ

1

Просто запустите тот же процесс, что и ваш открывающий элемент, где вы определили словарь пространств имен с помощью nsmap аргумент. Обратите внимание на добавленную переменную в вашем классе:

from lxml.etree import * 

class XMLNamespaces: 
    ex = 'http://www.example1.org' 
    xmlns = 'http://www.example2.org' 
    xyz = 'xyz' 

root = Element('definitions', xmlns='http://www.example2.org', nsmap={'ex':XMLNamespaces.ex}) 
type_ref = SubElement(root, 'typeRef', nsmap={'ns2':XMLNamespaces.xyz}) 
type_ref.text = 'text' 

tree = ElementTree(root) 
tree.write('filename.xml', pretty_print=True) 

# <definitions xmlns:ex="http://www.example1.org" xmlns="http://www.example2.org"> 
# <typeRef xmlns:ns2="xyz">text</typeRef> 
# </definitions> 
Смежные вопросы