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