<jupyter_start><jupyter_text>[![imagenes/pythonista.png](imagenes/pythonista.png)](https://pythonista.io)  El estándar XML. XML es el acrónimo de "Extensible Markup Language" que se puede traducir como Lenguaje Extensible de Marcadores y corresponde a un estándar general para serializar datos de diversas índoles de forma estructurada.El estándar de XML fue publicado en 1996 por el W3C y se utiliza de forma intensiva para definir estructuras de datos.A un documento XML se le conoce como *Elemento* y contiene estructuras de datos basada en contenidos delimitados por marcadores (markups). Dichos marcadores corresponden a etiquetas (tags) que indican el principio y el fin de la estructura que delimitan.  El paquete *xml.etree.ElementTree*El paquete *xml* forma parte de la Biblioteca Estándar de Python y contiene a su vez  una serie de paquetes y módulos especializados en la gestión y manipulación de documentos estrcuturados.El paquete *xml.etree.ElementTree*, se especializa en documentos XML y contiene diversas clases y funciones que se pueden utilizar para tal propósito.<jupyter_code>import xml.etree.ElementTree as ET
dir(ET)<jupyter_output><empty_output><jupyter_text>La clase * Element*.El módulo *xml.etree.elementree* contiene a la clase *Element*, la cual permite inspeccionar un documento XML mediante el el acceso a sus métodos y atributos, así como el indexado de sus elementos.  Documento de ejemplo. El documento localizado en [data/cursos.xml](data/cursos.xml) contiene el siguiente código:``` xml                    Introductorio        2018        https://pythonista.mx/cursos/py101                                                                                                                                                                                                Introductorio        2018        "https://pythonista.mx/cursos/py111"                                                                                                                              Introductorio        2018        "https://pythonista.mx/cursos/py121"                                                                                                              ```  Adqusición de XML a partir de una cadena de caracteres.``` pythonElementtree.fromstring()```  Adquisición de XML a partir de un archivo. Lectura de un archivo XML.``` pythonElementtree.parse('')``` Creación de un objeto *Element* a partir del archivo.```.getroot()```**Ejemplo:**<jupyter_code>%pwd
cursos = ET.parse("/opt/pythonista/py121/data/cursos.xml")
raiz = cursos.getroot()
help(raiz)
dir(raiz)
raiz.tag<jupyter_output><empty_output><jupyter_text>Acceso a atributos.<jupyter_code>for hijo in raiz:
    print(hijo.tag, hijo.attrib)<jupyter_output><empty_output><jupyter_text>Acceso al contenido de los atributos.<jupyter_code>for hijo in raiz:
    print(hijo.tag, hijo.attrib['clave'])<jupyter_output><empty_output><jupyter_text>Los elementos dentro del objeto "Element" son indexables.<jupyter_code>raiz[0][4]
raiz[0][4].attrib
print(raiz[0][1].text)
raiz[0][1]<jupyter_output><empty_output><jupyter_text>Búsqueda mediante XPath.XPath permite realizar búsquedas dentro de un elemento XML de forma similar a como se busca en la ruta de un sistema de archivos mediante expresiones.Puede conocer más sobre la especificaciónde XPath en https://www.w3.org/TR/xpath/.El módulo *Elementtree* cuenta con soporte limitado para las expresiones de XPath. Puede consultar dichasd expresiones en https://docs.python.org/3/library/xml.etree.elementtree.htmlxpath-support **Ejemplo:**<jupyter_code>raiz.findall('./curso')
raiz.findall('./curso/url')[1].text
for dato in raiz.findall('curso[@clave]'):
    print(dato.attrib['clave'])
raiz.findall('curso[@clave="py121"]')
raiz.findall('curso[@clave="py121"]')[0].attrib
raiz.find('curso/tema[@nombre="Persistencia de objetos"]')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.09072164948453608, 'fraction_numerical': 0.01211340206185567, 'mean_word_length': 3.0766806722689077, 'pattern_counts': {'":': 0, '<': 25, '<?xml version=': 0, '>': 25, 'https://': 6, 'lorem ipsum': 0, 'www.': 1, 'xml': 10}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 19, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '147252', 'license': 'MIT', 'n_tokens_mistral': 1212, 'n_tokens_neox': 1196, 'n_words': 338, 'path': '11_xml_con_elementtree.ipynb', 'repo_name': 'daviqui/py121', 'size': '3880'}