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

Я пытаюсь использовать библиотеку Pythons 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 ?

    Проблема заключается в имени вашего атрибута.

     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"/>