Più spazi dei nomi XML in tag con LXML
Domanda
Sto cercando di usare biblioteca Pythons LXML per creare un file GPX che può essere letto da Garmin Mapsource prodotto. L'intestazione sulla loro GPX file assomiglia a questo
<?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">
Quando uso il seguente codice:
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))
I ottenere:
<?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"/>
Che ha il tag ns0
fastidioso. Questo potrebbe essere XML perfettamente valido ma Mapsource non apprezzarlo.
Qualsiasi idea di come ottenere questo di non avere il tag ns0
?
Soluzione
Il problema è con il vostro nome dell'attributo.
attrib={"{xsi}schemaLocation" : schemaLocation},
mette schemaLocation nello spazio dei nomi XSI.
Credo che si intende
attrib={"{" + xsi + "}schemaLocation" : schemaLocation}
per utilizzare l'URL per XSI. Questo soddisfa le vostre usi delle variabili namespace nel nome dell'elemento. Si mette l'attributo nello spazio dei nomi http://www.w3.org/2001/XMLSchema-instance
che dà il risultato di
<?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"/>