print from etree python namespaces lxml

from - Accesando valores en el archivo xml con espacios de nombres en python 2.7 lxml



python etree lxml (1)

Use el método xpath() con namespaces llamado argumento:

namespaces = { ''rdf'': ''http://www.w3.org/1999/02/22-rdf-syntax-ns#'', ''dcat'': ''http://www.w3.org/ns/dcat#'', ''dct'': ''http://purl.org/dc/terms/'' } print(doc.xpath(''//rdf:RDF'', namespaces=namespaces)) print(doc.xpath(''//dcat:Dataset'', namespaces=namespaces)) print(doc.xpath(''//dct:identifier'', namespaces=namespaces))

Estoy siguiendo este enlace para tratar de obtener valores de varias etiquetas:

Análisis de XML con espacio de nombre en Python a través de ''ElementTree''

En este enlace no hay ningún problema para acceder a la etiqueta raíz de esta manera:

import sys from lxml import etree as ET doc = ET.parse(''file.xml'') namespaces_rdf = {''rdf'': ''http://www.w3.org/1999/02/22-rdf-syntax-ns#''} # add more as needed namespaces_dcat = {''dcat'': ''http://www.w3.org/ns/dcat#''} # add more as needed namespaces_dct = {''dct'': ''http://purl.org/dc/terms/''} print doc.findall(''rdf:RDF'', namespaces_rdf) print doc.findall(''dcat:Dataset'', namespaces_dcat) print doc.findall(''dct:identifier'', namespaces_dct)

SALIDA:

[] [<Element {http://www.w3.org/ns/dcat#}Dataset at 0x2269b98>] []

Solo tengo acceso a dcat: Dataset, y no puedo ver cómo acceder al valor de rdf: about

Y luego acceso a dct: identificador

Por supuesto, una vez que he accedido a esta información, necesito acceder a dcat: información de distribución

Este es mi archivo de ejemplo, generado con ckanext-dcat:

<?xml version="1.0" encoding="utf-8"?> <rdf:RDF xmlns:dct="http://purl.org/dc/terms/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dcat="http://www.w3.org/ns/dcat#" > <dcat:Dataset rdf:about="http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01"> <dct:identifier>ec631628-2f46-4f17-a685-d62a37466c01</dct:identifier> <dct:description>FOO-Description</dct:description> <dct:title>FOO-title</dct:title> <dcat:keyword>keyword1</dcat:keyword> <dcat:keyword>keyword2</dcat:keyword> <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2014-10-08T08:55:04.566618</dct:issued> <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2015-06-25T11:04:10.328902</dct:modified> <dcat:distribution> <dcat:Distribution rdf:about="http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01/resource/f5707551-6bf3-468f-9a96-b4184cc51d1f"> <dct:title>FOO-title-1</dct:title> <dct:description>FOO-Description-1</dct:description> <dcat:accessURL>http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01/resource/f5707551-6bf3-468f-9a96-b4184cc51d1f/download/myxls.xls</dcat:accessURL> <dct:format>XLS</dct:format> </dcat:Distribution> </dcat:distribution> <dcat:distribution> <dcat:Distribution rdf:about="http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01/resource/74c1acc8-b2b5-441b-afb2-d072d0d00a7f"> <dct:format>XLS</dct:format> <dct:title>FOO-title-2</dct:title> <dct:description>FOO-Description-2</dct:description> <dcat:accessURL>http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01/resource/74c1acc8-b2b5-441b-afb2-d072d0d00a7f/download/myxls.xls</dcat:accessURL> </dcat:Distribution> </dcat:distribution> </dcat:Dataset> </rdf:RDF>

¿Alguna idea sobre cómo acceder a esta información? Gracias

ACTUALIZACIÓN: Bueno, necesito acceder a rdf: sobre en:

<dcat:Dataset rdf:about="http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01">

entonces con este código tomado de:

Parse xml con lxml - extraer valor del elemento

for node in doc.xpath(''//dcat:Dataset'', namespaces=namespaces): # Iterate over attributes for attrib in node.attrib: print ''@'' + attrib + ''='' + node.attrib[attrib]

Obtengo esta salida:

[<Element {http://www.w3.org/ns/dcat#}Dataset at 0x23d8ee0>] @{http://www.w3.org/1999/02/22-rdf-syntax-ns#}about=http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01

Entonces, la pregunta es:

¿Cómo puedo preguntar si el atributo está a punto de tomar este valor, porque en otros archivos tengo varias etiquetas?

ACTUALIZACIÓN 2: Se corrigió cómo obtengo el valor (notaciones de clark)

for node in doc.xpath(''//dcat:Dataset'', namespaces=namespaces): # Iterate over attributes for attrib in node.attrib: if attrib.endswith(''about''): #do my jobs

Bueno, casi terminado, pero tengo la última pregunta: necesito saber cuándo accedo a mi

<dct:title>

a la cual pertenece, tengo:

<dcat:Dataset rdf:about="http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01"> <dct:title>FOO-title</dct:title> <dcat:Distribution rdf:about="http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01/resource/f5707551-6bf3-468f-9a96-b4184cc51d1f"> <dct:title>FOO-title-1</dct:title> <dcat:Distribution rdf:about="http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01/resource/74c1acc8-b2b5-441b-afb2-d072d0d00a7f"> <dct:title>FOO-title-2</dct:title>

Si hago algo como esto obtengo:

for node in doc.xpath(''//dct:title'', namespaces=namespaces): print node.tag, node.text {http://purl.org/dc/terms/}title FOO-title {http://purl.org/dc/terms/}title FOO-title-1 {http://purl.org/dc/terms/}title FOO-title-2

Gracias