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.

Analizar archivo XML con Python3

No estoy familiarizado en absoluto con los archivos XML, pero estoy intentando analizar esto:

<?xml version="1.0" encoding="ISO-8859-1"?>
<modeling>
 <generator>
  <i name="subversion" type="string">(build Dec 07 2018 23:19:03) complex            parallel </i>
  <i name="platform" type="string">LinuxIFC </i>
  <i name="date" type="string">2019 07 11 </i>
  <i name="time" type="string">11:56:12 </i>
 </generator>
 <incar>
  <i type="int" name="ISTART">     0</i>
  <i type="string" name="PREC">accurate</i>
  <i type="int" name="ISPIN">     2</i>
  <i type="int" name="NELMDL">    -8</i>
  <i type="int" name="IBRION">     2</i>
  <i name="EDIFF">      0.00001000</i>
  <i name="EDIFFG">     -0.01000000</i>
  <i type="int" name="NSW">   200</i>
  <i type="int" name="ISIF">     2</i>
  <i type="int" name="ISYM">     2</i>
  <i name="ENCUT">    750.00000000</i>
  <i name="POTIM">      0.30000000</i>
 </incar>
</modeling>

hasta ahora, he logrado escribir código para obtener los elementos como:

#!/usr/bin/env python
import xml.etree.ElementTree as ET

tree = ET.parse("vasprun.xml")
root = tree.getroot()
for child in root:
  print({x for x in root.findall(child.tag)})

que da como resultado:

{<element 'generator'="" at="" 0x7f342220ca90="">}
{<element 'incar'="" at="" 0x7f342220cd10="">}

Estoy intentando obtener el archivo de incar como:

IStart=0
Prec=accurate

¿Alguien puede ayudarme a conseguir esto?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Claro, puedes usar el método find() de Element para encontrar los elementos hijos y luego recuperar el texto usando la propiedad .text. Aquí tienes un código de ejemplo:

    #!/usr/bin/env python
    import xml.etree.ElementTree as ET
    
    tree = ET.parse("vasprun.xml")
    root = tree.getroot()
    
    incar = root.find('incar') # encuentra el elemento incar
    IStart = incar.find('i[@name="ISTART"]').text # encuentra el elemento i con nombre=ISTART
    Prec = incar.find('i[@name="PREC"]').text # encuentra el elemento i con nombre=PREC
    
    print('IStart =', IStart)
    print('Prec =', Prec)
    

    Salida:

    IStart =      0
    Prec = accurate
    

Comments are closed.