es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo manejar el espacio de nombres ‘vacío’ durante el análisis?

Estoy confundido/a por lo que hace el atributo xmlns="" en el elemento articleDoc. Pensaría que los subelementos de articleDoc no tienen un espacio de nombres y se pueden consultar con XPath sin él. Pero XPath no los encuentra. Usar el espacio de nombres w3.org, que está declarado en el elemento raíz, tampoco funciona.

import xml.etree.cElementTree as tree

xml = """<?xml version="1.0" encoding="UTF-8"?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <id>1</id>
  <title>Example XML</title>
  <published>2021-12-15T00:00:00Z</published>
  <updated>2022-01-06T12:44:47Z</updated>
  <content type="application/xml">
    <articledoc xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" schemaversion="1.8" xml:lang="en">
      <articledochead>
        <iteminfo>mi información</iteminfo>
      </articledochead>
    </articledoc>
  </content>
</entry>"""
ns = {'nitf': 'http://iptc.org/std/NITF/2006-10-18/',
      'w3': 'http://www.w3.org/2005/Atom',
      'xml': 'http://www.w3.org/XML/1998/namespace'}
root = tree.fromstring(xml)
id = root.find("w3:id", ns).text # funciona
print(id)
type_attribute = root.find("w3:content", ns).attrib['type'] # funciona

Aquí está lo que he intentado hasta ahora:

root.find(“itemInfo”, ns)

root.find(“articleDoc/itemInfo”, ns)

root.find(“w3:articleDoc/itemInfo”, ns)

root.find(“w3:itemInfo”, ns)

root.find(“itemInfo”)

Cualquier ayuda es apreciada!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El atributo xmlns="" en el elemento articleDoc establece el espacio de nombres predeterminado como una cadena vacía para todos sus subelementos. Esto significa que todos los subelementos sin un prefijo de espacio de nombres pertenecen al mismo espacio de nombres que articleDoc.

    Para consultar estos subelementos con XPath, es necesario usar el mismo espacio de nombres que el elemento articleDoc. Esto se puede hacer agregando un alias en el diccionario ns y usándolo en la expresión XPath:

    ns = {'w3': 'http://www.w3.org/2005/Atom', '': 'http://www.w3.org/2005/Atom'}
    item_info = root.find("w3:content/w3:articleDoc/articleDocHead/itemInfo", ns)
    print(item_info.text)
    

    Tenga en cuenta que el diccionario ns ahora tiene un alias de cadena vacía que apunta al mismo espacio de nombres que w3.

Comments are closed.