Saltar al contenido

Compruebe si el elemento XML tiene hijos o no, en ElementTree

Esta es el arreglo más exacta que te podemos brindar, sin embargo mírala detenidamente y analiza si se puede adaptar a tu trabajo.

Solución:

Podrías probar el list función en el elemento:

>>> xml = """
  value1
  value2
  value3
  
    value222
    value22
  
"""
>>> root = ET.fromstring(xml)
>>> list(root[0])
[]
>>> list(root[3])
[, ]
>>> len(list(root[3]))
2
>>> print "has children" if len(list(root[3])) else "no child"
has children
>>> print "has children" if len(list(root[2])) else "no child"
no child
>>> # Or simpler, without a call to list within len, it also works:
>>> print "has children" if len(root[3]) else "no child"
has children

Modifiqué tu muestra porque el findall llamada de función en el item root no funcionó (como findall buscará descendientes directos, y no el elemento actual). Si desea acceder al texto de los subhijos después en su programa de trabajo, puede hacer lo siguiente:

for child in root.findall("item"):
  # if there are children, get their text content as well.
  if len(child): 
    for subchild in child:
      subchild.text
  # else just get the current child text.
  else:
    child.text

Sin embargo, esto sería una buena opción para un recurso recursivo.

La forma más sencilla que he podido encontrar es usar el bool valor del elemento directamente. Esto significa que puedes usar a4 en una declaración condicional tal cual:

a4 = Element('a4')
if a4:
    print('Has kids')
else:
    print('No kids yet')

a4.append(Element('x'))
if a4:
    print('Has kids now')
else:
    print('Still no kids')

Ejecutar este código imprimirá

No kids yet
Has kids now

El valor booleano de un elemento no dice nada sobre text, tail o attributes. Solo indica la presencia o ausencia de niños, que es lo que preguntaba la pregunta original.

Personalmente, recomendaría que use un analizador xml que admita completamente las expresiones xpath. El subconjunto soportado por xml.etree es insuficiente para tareas como esta.

por ejemplo, en lxml Puedo hacer:

dame todos los hijos de los hijos del nodo”:

doc.xpath('//item/*/child::*') #equivalent to '//item/*/*', if you're being terse
Out[18]: [, ]

o,

“dame todo los hijos que no tienen hijos propios”:

doc.xpath('/item/*[count(child::*) = 0]')
Out[20]: 
[,
 ,
 ]

o,

“dame TODOS los elementos que no tengan hijos”:

doc.xpath('//*[count(child::*) = 0]')
Out[29]: 
[,
 ,
 ,
 ,
 ]

# and if I only care about the text from those nodes...
doc.xpath('//*[count(child::*) = 0]/text()')
Out[30]: ['value1', 'value2', 'value3', 'value222', 'value22']

valoraciones y comentarios

Más adelante puedes encontrar las críticas de otros creadores, tú también tienes el poder dejar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *