2010-05-17 25 views
12

Estoy tratando de usar la biblioteca Pythons LXML para crear un archivo GPX que pueda ser leído por el producto Mapsource de Garmin. El encabezado en sus archivos GPX se parece a estoMúltiples espacios de nombres XML en la etiqueta con LXML

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

Cuando uso el siguiente código:

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)) 

me sale:

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

que tiene la etiqueta de ns0 molesto. Este podría ser un XML perfectamente válido pero Mapsource no lo aprecia.

¿Alguna idea de cómo conseguir que esto no tenga la etiqueta ns0?

Respuesta

11

El problema es con el nombre de su atributo.

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

pone schemaLocation en el espacio de nombres xsi.

creo que quería decir

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

utilizar el URL para XSI. Esto coincide con sus usos de las variables de espacio de nombres en el nombre del elemento. Se pone el atributo en el espacio de nombres http://www.w3.org/2001/XMLSchema-instance

que da el resultado de

<?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"/> 
+0

Ver esto es por eso que soy un aficionado y no codifican para una vida! Respuesta perfecta. Gracias! – lonerockz

Cuestiones relacionadas