Несколько пространств имен XML в теге с LXML

Я пытаюсь использовать библиотеку Python LXML для создания файла GPX, который может быть прочитан продуктом Garmin Mapsource. Заголовок в их файлах GPX выглядит так

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" 
     creator="MapSource 6.15.5" version="1.1" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">

Когда я использую следующий код:

xmlns = "http://www.topografix.com/GPX/1/1"
xsi = "http://www.w3.org/2001/XMLSchema-instance"
schemaLocation = "http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"
version = "1.1"
ns = "{xsi}"

getXML = etree.Element("{" + xmlns + "}gpx", version=version, attrib={"{xsi}schemaLocation": schemaLocation}, creator='My Product', nsmap={'xsi': xsi, None: xmlns})
print(etree.tostring(getXML, xml_declaration=True, standalone='Yes', encoding="UTF-8", pretty_print=True))

Я получил:

<?xml version=\'1.0\' encoding=\'UTF-8\' standalone=\'yes\'?>
<gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns="http://www.topografix.com/GPX/1/1" xmlns:ns0="xsi"
     ns0:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"
     version="1.1" creator="My Product"/>

Который имеет раздражающий тег ns0. Это может быть вполне допустимый XML, но Mapsource его не ценит.

Любая идея, как заставить это не иметь тега ns0?


person lonerockz    schedule 17.05.2010    source источник


Ответы (1)


Проблема с именем вашего атрибута.

attrib={"{xsi}schemaLocation" : schemaLocation},

помещает schemaLocation в пространство имен xsi.

Я думаю, ты имел в виду

attrib={"{" + xsi + "}schemaLocation" : schemaLocation}

использовать URL для xsi. Это соответствует вашему использованию переменных пространства имен в имени элемента. Он помещает атрибут в пространство имен http://www.w3.org/2001/XMLSchema-instance

Это дает результат

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
     xmlns="http://www.topografix.com/GPX/1/1" 
     xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd" 
     version="1.1" 
     creator="My Product"/>
person mmmmmm    schedule 17.05.2010
comment
Вот почему я любитель и не зарабатываю на жизнь программированием! Идеальный ответ. Спасибо! - person lonerockz; 20.05.2010