Leyendo el archivo XML y obteniendo el valor de sus atributos en Python

Tengo este archivo XML:

 virtual bug 66523dfdf555dfd  hvm    524288 270336 10 

Ahora, quiero analizar esto y obtener su valor de atributo. Por ejemplo, quiero recuperar el campo uuid . Entonces, ¿cuál debería ser el método adecuado para buscarlo en Python?

Aquí hay un fragmento de código lxml que extrae un atributo , así como el texto del elemento (su pregunta fue un poco ambigua sobre cuál necesitaba, así que incluyo ambos):

 from lxml import etree doc = etree.parse(filename) memoryElem = doc.find('memory') print memoryElem.text # element text print memoryElem.get('unit') # attribute 

Usted preguntó (en un comentario sobre la respuesta de Ali Afshar) si minidom ( 2.x , 3.x ) es una buena alternativa. Aquí está el código equivalente usando minidom; juzga por ti mismo lo que es mejor:

 import xml.dom.minidom as minidom doc = minidom.parse(filename) memoryElem = doc.getElementsByTagName('memory')[0] print ''.join( [node.data for node in memoryElem.childNodes] ) print memoryElem.getAttribute('unit') 

lxml me parece el ganador.

XML

   item1 item2 item3 item4   

Python:

 from xml.dom import minidom xmldoc = minidom.parse('items.xml') itemlist = xmldoc.getElementsByTagName('item') print "Len : ", len(itemlist) print "Attribute Name : ", itemlist[0].attributes['name'].value print "Text : ", itemlist[0].firstChild.nodeValue for s in itemlist : print "Attribute Name : ", s.attributes['name'].value print "Text : ", s.firstChild.nodeValue 

etree, con lxml probablemente:

 root = etree.XML(MY_XML) uuid = root.find('uuid') print uuid.text 

Otras personas pueden decirle cómo hacerlo con la biblioteca estándar de Python. Recomendaría mi propia mini-biblioteca que hace que esto sea completamente sencillo.

 >>> obj = xml2obj.xml2obj(""" ... virtual bug ... 66523dfdf555dfd ...  ... hvm ...  ...  ...  ... 524288 ... 270336 ... 10 ... """) >>> obj.uuid u'66523dfdf555dfd' 

http://code.activestate.com/recipes/534109-xml-to-python-data-structure/

Yo usaría lxml y lo analizaría usando xpath //UUID

Por encima de XML no tiene etiqueta de cierre, le dará

Error de análisis de etree: final prematuro de los datos en la etiqueta

XML correcto es:

  virtual bug 66523dfdf555dfd  hvm    524288 270336 10  

Puede intentar analizarlo usando (recover = True). Puedes hacer algo como esto.

 parser = etree.XMLParser(recover=True) tree = etree.parse('your xml file', parser) 

Utilicé esto recientemente y funcionó para mí, puedes intentarlo y verlo, pero en caso de que necesites realizar extracciones de datos xml más completas, puedes echar un vistazo a este código que escribí para un proyecto que se ocupa de extracciones complejas de datos xml.