Analizar el espacio de nombres XML con el árbol de elementos findall

¿Cómo puedo usar un árbol de elementos de consulta findall('Email') dado el siguiente xml?

    Signer joe@gmail.com Joe Shmoe 1 2015-05-04T09:58:01.947 2015-05-04T09:58:14.403 2015-05-04T09:58:29.473    

Tengo la sensación de que tiene que ver con el espacio de nombres, pero no estoy seguro. Miré los documentos y no tuve suerte.

 tree =  root = tree.getroot() root  root.findall('Email') [] 

Debe leer los documentos más detenidamente, en particular la sección sobre Análisis de XML con espacios de nombres , que incluye un ejemplo que es casi exactamente lo que desea.

Pero incluso sin los documentos, la respuesta está realmente contenida en su salida de ejemplo. Cuando imprimiste el elemento raíz de tu documento …

 >>> tree = etree.parse(open('data.xml')) >>> root = tree.getroot() >>> root  

… puede ver que imprimió el nombre del elemento raíz ( DocuSignEnvelopeInformation ) con un prefijo de espacio de nombres ( {http://www.docusign.net/API/3.0} ). Puede usar este mismo prefijo como parte de su argumento para encontrar findall :

 >>> root.findall('{http://www.docusign.net/API/3.0}Email') 

Pero esto por sí solo no funcionará, ya que solo encontraría elementos de Email que son hijos inmediatos del elemento raíz. Debe proporcionar una expresión ElementPath para que findall realice una búsqueda en todo el documento. Esto funciona:

 >>> root.findall('.//{http://www.docusign.net/API/3.0}Email') [] 

También puede realizar una búsqueda similar utilizando XPath y prefijos de espacio de nombres, como este:

 >>> root.xpath('//docusign:Email', ... namespaces={'docusign': 'http://www.docusign.net/API/3.0'}) [] 

Esto le permite usar espacios de namespace: similares a XML namespace: prefijos en lugar de la syntax del espacio de nombres LXML.