2011-08-02 15 views
5

¿Cuál es la mejor manera de manejar la falta de un espacio de nombres en algunos de los nodos en un documento xml utilizando lxml? ¿Debo primero modificar todos los nodos nombrados Ninguno para agregar el nombre "gmd" y luego cambiar los atributos del árbol por el nombre http://www.isotc211.org/2005/gmd como "gmd"? Si es así, ¿hay una manera clara de hacerlo con lxml u otra cosa que sea relativamente limpia/segura?¿Cómo se usa xpath desde lxml en nulos espacios con nombre de nulo?

from lxml import etree 
nsmap = charts_tree.nsmap 
nsmap.pop(None) # complains without this on the xpath with 
# TypeError: empty namespace prefix is not supported in XPath 
len (charts_tree.xpath('//*/gml:Polygon',namespaces=nsmap)) 
# 1180 
len (charts_tree.xpath('//*/DS_DataSet',namespaces=nsmap)) 
# 0 ... Bummer! 
len (charts_tree.xpath('//*/DS_DataSet')) 
# 0 ... Also a bummer 

e.g. http://www.charts.noaa.gov/ENCs/ENCProdCat_19115.xml

<DS_Series xmlns="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:gsr="http://www.isotc211.org/2005/gsr" xmlns:gss="http://www.isotc211.org/2005/gss" xmlns:gts="http://www.isotc211.org/2005/gts" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20070417/gmd/gmd.xsd"> 
<composedOf> 
    <DS_DataSet> 
     <has> 
      <MD_Metadata> 
       <parentIdentifier> 
        <gco:CharacterString>NOAA ENC Product Catalog</gco:CharacterString> 
       </parentIdentifier> 
... 
<EX_BoundingPolygon> 
    <polygon> 
     <gml:Polygon gml:id="US1AK90M_P1"> 
      <gml:exterior> 
       <gml:LinearRing> 
        <gml:pos>67.61505 -178.99979</gml:pos> 
        <gml:pos>73.99999 -178.99979</gml:pos> 
... 
        <gml:pos>64.99997 -178.99979</gml:pos> 
        <gml:pos>67.61505 -178.99979</gml:pos> 
       </gml:LinearRing> 

Respuesta

9

Creo que su DS_DataSet es en virtud de estar dentro de los DS_Series (lo que implica un espacio de nombres por defecto de "http://www.isotc211.org/2005/gmd") que soporta un espacio de nombres.

Trate de mapear eso en su diccionario de espacios de nombres (probablemente pueda probar primero a través de una impresión para ver si ya está allí, de lo contrario agréguelo y consulte el espacio de nombres con su nueva clave).

nsmap['some_ns'] = "http://www.isotc211.org/2005/gmd" 
len (charts_tree.xpath('//*/some_ns:DS_DataSet',namespaces=nsmap)) 

que se convierte en:

nsmap['gmd'] = nsmap[None] 
nsmap.pop(None) 
len(charts_tree.xpath('//*/gmd:DS_DataSet',namespaces=nsmap)) 
+0

Esto parece correcto, pero no soy un gurú. –

+2

raro pero funciona –

Cuestiones relacionadas