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.