Форум сайта python.su
0
Доброго времени суток всем!
Ребята, подскажите, пожалуйста, как правильно определить пространство имен в XML файле при помощи lxml.
Мне нужен вот такой результат на выходе:
<?xml version=“1.0” encoding=“UTF-8”?>
<notificationRequest xmlns="http://www.meinpaket.de/xsd/dietmar/1.0/orders“
xmlns:common=”http://www.meinpaket.de/xsd/dietmar/1.0/common“
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance“
version=”1.0">
import lxml.etree import os xmlns = "http://www.meinpaket.de/xsd/dietmar/1.0/orders" xmlns_xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns_common = "http://www.meinpaket.de/xsd/dietmar/1.0/common" NSMAP = {None: xmlns, 'xsi': xmlns_xsi} root = lxml.etree.Element('notificationRequest', nsmap=NSMAP) root = lxml.etree.Element('notificationRequest') root.set('xmlns', xmlns) root.set('version', '1.0') root.set('{http://www.w3.org/2001/XMLSchema-instance}common', xmlns_common) head = lxml.etree.SubElement(root, 'data') handle = lxml.etree.tostring(root, pretty_print=True, encoding='utf-8', xml_declaration=True) with open(os.path.join(os.getcwd(), "text.xml"), "wb") as f: f.write(handle)
<?xml version='1.0' encoding='utf-8'?>
<notificationRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance“ xmlns=”http://www.meinpaket.de/xsd/dietmar/1.0/orders“ version=”1.0“ xsi:common=”http://www.meinpaket.de/xsd/dietmar/1.0/common">
<?xml version='1.0' encoding='utf-8'?>Появляется префикс ns0, а определение xmlns:xsi исчезает вовсе.
<notificationRequest xmlns:ns0="http://www.meinpaket.de/xsd/dietmar/1.0/orders“ xmlns=”http://www.meinpaket.de/xsd/dietmar/1.0/orders“ version=”1.0“ ns0:common=”http://www.meinpaket.de/xsd/dietmar/1.0/common">
Офлайн
34
У вас в NSMAP указаны не все namespace.
from lxml import etree nsmap = { None: 'http://www.meinpaket.de/xsd/dietmar/1.0/orders', 'common': 'http://www.meinpaket.de/xsd/dietmar/1.0/common', 'xsi': 'http://www.w3.org/2001/XMLSchema-instance', } e = etree.Element('notificationRequest', nsmap=nsmap) print etree.tostring(e) '<notificationRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:common="http://www.meinpaket.de/xsd/dietmar/1.0/common" xmlns="http://www.meinpaket.de/xsd/dietmar/1.0/orders"/>'
Офлайн
0
GreyZmeem, спасибо огромное!
Я пробовал такой вариант решения, но он у меня не заработал. Теперь понимаю почему - отсутствовала запятая после последнего элемента словаря NSMAP. У меня он вот так выглядел:
NSMAP = { None: 'http://www.meinpaket.de/xsd/dietmar/1.0/orders', 'xsi': 'http://www.w3.org/2001/XMLSchema-instance', 'common': 'http://www.meinpaket.de/xsd/dietmar/1.0/common'}
print(root.nsmap)
Офлайн
34
Скорей всего вы просто где-то ошиблись. Запятая ни на что не влияет 
Офлайн
0
Действительно, теперь и без запятой работает… Чудеса)))
Скорее всего, действительно где-то еще ошибся.
Спасибо еще раз!
Офлайн