Buscar..


Observaciones

No todos los elementos de la entrada XML terminarán como elementos del árbol analizado. Actualmente, este módulo omite los comentarios XML, las instrucciones de procesamiento y las declaraciones de tipo de documento en la entrada. Sin embargo, los árboles construidos utilizando la API de este módulo en lugar de analizar a partir de texto XML pueden tener comentarios e instrucciones de procesamiento; Se incluirán al generar la salida XML.

Abriendo y leyendo usando un ElementTree

Importe el objeto ElementTree, abra el archivo .xml relevante y obtenga la etiqueta raíz:

import xml.etree.ElementTree as ET
tree = ET.parse("yourXMLfile.xml")
root = tree.getroot()

Hay algunas maneras de buscar a través del árbol. Primero es por iteración:

for child in root:
    print(child.tag, child.attrib)

De lo contrario, puede hacer referencia a ubicaciones específicas como una lista:

print(root[0][1].text)

Para buscar etiquetas específicas por nombre, use .find o .findall :

print(root.findall("myTag"))
print(root[0].find("myOtherTag"))

Modificar un archivo XML

Importar módulo de árbol de elementos y abrir archivo xml, obtener un elemento xml

import xml.etree.ElementTree as ET
tree = ET.parse('sample.xml')
root=tree.getroot()
element = root[0] #get first child of root element

El objeto elemento se puede manipular cambiando sus campos, agregando y modificando atributos, agregando y eliminando elementos secundarios

element.set('attribute_name', 'attribute_value') #set the attribute to xml element
element.text="string_text"

Si desea eliminar un elemento use el método Element.remove ()

root.remove(element)

Método ElementTree.write () utilizado para generar un objeto xml en archivos xml.

tree.write('output.xml')

Crear y construir documentos XML

Módulo de árbol de elementos de importación

import xml.etree.ElementTree as ET

La función Element () se utiliza para crear elementos XML

p=ET.Element('parent')

Función de elemento secundario () utilizada para crear subelementos a un elemento dado

c = ET.SubElement(p, 'child1')

La función dump () se utiliza para volcar elementos xml.

ET.dump(p)
# Output will be like this
#<parent><child1 /></parent>

Si desea guardar en un archivo, cree un árbol xml con la función ElementTree () y guarde en un archivo con el método write ()

tree = ET.ElementTree(p)
tree.write("output.xml")

La función Comentario () se utiliza para insertar comentarios en un archivo xml.

comment = ET.Comment('user comment')
p.append(comment) #this comment will be appended to parent element

Abrir y leer archivos XML grandes utilizando iterparse (análisis incremental)

A veces no queremos cargar el archivo XML completo para obtener la información que necesitamos. En estos casos, es útil poder cargar incrementalmente las secciones relevantes y luego eliminarlas cuando hayamos terminado. Con la función iterparse puede editar el árbol de elementos que se almacena mientras se analiza el XML.

Importe el objeto ElementTree:

import xml.etree.ElementTree as ET

Abra el archivo .xml e itere sobre todos los elementos:

for event, elem in ET.iterparse("yourXMLfile.xml"):
    ... do something ...

Alternativamente, solo podemos buscar eventos específicos, como etiquetas de inicio / finalización o espacios de nombres. Si esta opción se omite (como anteriormente), solo se devuelven eventos "finales":

events=("start", "end", "start-ns", "end-ns")
for event, elem in ET.iterparse("yourXMLfile.xml", events=events):
    ... do something ...

Aquí está el ejemplo completo que muestra cómo borrar elementos del árbol en memoria cuando terminemos con ellos:

for event, elem in ET.iterparse("yourXMLfile.xml", events=("start","end")):        
    if elem.tag == "record_tag" and event == "end":
        print elem.text
        elem.clear()
    ... do something else ...

Buscando el XML con XPath

A partir de la versión 2.7, ElementTree tiene un mejor soporte para consultas XPath. XPath es una sintaxis que le permite navegar a través de un xml como SQL se utiliza para buscar a través de una base de datos. Tanto las funciones find y findall son compatibles con XPath. El siguiente XML se utilizará para este ejemplo.

 <Catalog>
    <Books>
        <Book id="1" price="7.95">
            <Title>Do Androids Dream of Electric Sheep?</Title>
            <Author>Philip K. Dick</Author>
        </Book>
        <Book id="5" price="5.95">
            <Title>The Colour of Magic</Title>
            <Author>Terry Pratchett</Author>
        </Book>
        <Book id="7" price="6.95">
            <Title>The Eye of The World</Title>
            <Author>Robert Jordan</Author>
        </Book>
    </Books>
</Catalog>

Buscando todos los libros:

import xml.etree.cElementTree as ET
tree = ET.parse('sample.xml')
tree.findall('Books/Book')

Buscando el libro con el título = 'El color de la magia':

tree.find("Books/Book[Title='The Colour of Magic']") 
# always use '' in the right side of the comparison

Buscando el libro con id = 5:

tree.find("Books/Book[@id='5']")
# searches with xml attributes must have '@' before the name

Busca el segundo libro:

tree.find("Books/Book[2]")
# indexes starts at 1, not 0

Buscar el último libro:

tree.find("Books/Book[last()]")
# 'last' is the only xpath function allowed in ElementTree

Búsqueda de todos los autores:

tree.findall(".//Author")
#searches with // must use a relative path


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow