Как включить пространства имен в xml-файл с помощью lxml?

Я создаю новый XML-файл с нуля, используя python и библиотеку lxml.

<route xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.xxxx" version="1.1" xmlns:stm="http://xxxx/1/0/0" xsi:schemaLocation="http://xxxx/1/0/0 stm_extensions.xsd"> 

Мне нужно включить эту информацию пространства имен в корневой тег в качестве атрибутов тега маршрута.

Я не могу включить информацию в корневую декларацию.

 from lxml import etree root = etree.Element("route", xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance", xmlns = "http://www.xxxxx", version = "1.1", xmlns: stm = "http://xxxxx/1/0/0" ) 

есть синтаксис SyntaxError: недопустимый

Как я могу это сделать ?

Вот как это можно сделать:

 from lxml import etree attr_qname = etree.QName("http://www.w3.org/2001/XMLSchema-instance", "schemaLocation") nsmap = {None: "http://www.xxxx", "stm": "http://xxxx/1/0/0", "xsi": "http://www.w3.org/2001/XMLSchema-instance"} root = etree.Element("route", {attr_qname: "http://xxxx/1/0/0 stm_extensions.xsd"}, version="1.1", nsmap=nsmap) print etree.tostring(root) 

Выход из этого кода (разрывы строк были добавлены для удобства чтения):

 <route xmlns:stm="http://xxxx/1/0/0" xmlns="http://www.xxxx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xxxx/1/0/0 stm_extensions.xsd" version="1.1"/> 

Основной «трюк» – использовать QName для создания атрибута xsi:schemaLocation . Атрибут с двоеточием в его имени не может использоваться как имя аргумента ключевого слова.

Я добавил объявление префикса xsi к nsmap , но его можно фактически опустить. lxml определяет префиксы по умолчанию для некоторых известных URI пространства имен, включая xsi для http://www.w3.org/2001/XMLSchema-instance .