Python Language
Manipulando XML
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