tutorial parse open namespace mac python xml lxml objectify

parse - Python Lxml(objectify): verificando si existe una etiqueta



python parse xml string (4)

Si su documento tiende a ser relativamente corto, puede iterar sobre todos los hijos de <main> buscando etiquetas que coincidan con su conjunto de nombres de variables:

tree = lxml.etree.fromstring(DATA) NAMES = set([''elem1'', ''elem3'']) for node in tree.iterchildren(): if node.tag in NAMES: print ''found'', node.tag

O puede buscar cada nombre de variable de uno en uno:

for tag in (''elem1'', ''elem3''): if tree.find(tag) is not None: print ''found'', tag

Necesito comprobar si existe una etiqueta determinada en un archivo xml.

Por ejemplo, quiero ver si la etiqueta existe en este fragmento:

<main> <elem1/> <elem2>Hi</elem2> <elem3/> ... </main>

Actualmente, estoy usando un truco feo con la comprobación de errores, como esto:

try: if root.elem1.tag: foo = elem1 except AttributeError: foo = "error finding elem1"

También quiero personalizar la cadena si no puede encontrar el nodo (es decir, "no se puede encontrar -tagname-").

Tengo que revisar una larga lista de variables, y no quiero repetir el código 100 veces.

¿Alguna sugerencia?

Editar:

Aquí hay un recorte del archivo xml real:

<main> <asset name="Virtual Dvaered Unpresence"> <virtual/> <presence> <faction>Dvaered</faction> <value>-1000.000000</value> <range>0</range> </presence> </asset> <asset name="Virtual Empire Small"> <virtual/> <presence> <faction>Empire</faction> <value>100.000000</value> <range>2</range> </presence> </asset> </main>

Quiero verificar si existe la etiqueta y, si es así, obtener los contenidos.

Editar edición: Ok, voy a combinar dos de las respuestas, pero solo puedo votar por una. Lo siento.

Edición 3: pregunta relacionada sobre XPath aquí: Python lxml (objectify): problemas con Xpath


Supongamos que desea obtener el valor de elem2, puede usar xpath para encontrarlo.

tree = etree.parse(StringIO(htmlString), etree.HTMLParser()).getroot() youWantValue = tree.xpath(''/main/elem2'')[0].text


hasattr() trabaja para esto:

if hasattr(root, ''elem1''): foo = root.elem1


Edición : respuesta actualizada para el archivo de muestra.

Supongo que desea buscar en cada activo ciertas etiquetas. Si es así, lo siguiente me funcionó:

import lxml.objectify # Parse the file. tree = lxml.objectify.parse(''sample.xml'') root = tree.getroot() # Which elements to find. to_find = set([''presence/faction'', ''presence/value'', ''fake'']) # Go through each asset in the document. for asset in root.findall(''asset''): # Check for each element. for name in to_find: node = asset.find(name) if node is not None: print ''Found %s, its value is %s'' % (name, node) else: print ''Unable to find %s'' % name

La salida fue:

Found presence/value, its value is -1000.0 Found presence/faction, its value is Dvaered Unable to find fake Found presence/value, its value is 100.0 Found presence/faction, its value is Empire Unable to find fake