Tasarım notu
@tdelaney tarafından cevap temelde doğru, ama Python eleman ağaç API biri nüans işaret etmek istiyorum. İşte the lxml
tutorial bir alıntı:
Elemanları metin içerebilir:
<root>TEXT</root>
sayıda XML belgeleri (veri merkezli belgelerde), bu metin bulunabilir tek yerdir. Ağaç hiyerarşisinin en altındaki bir yaprak etiketi ile kapsüllenir. , <br/>
etikettir İşte
<html><body>Hello<br/>World</body></html>
: XML böyle (X) HTML olarak etiketlenmiş metin belgeleri için kullanılırsa
Ancak, metni de doğru ağacın ortasında, farklı öğeler arasında görünebilir metinle çevrili Bu genellikle belge stili veya karma içerikli XML olarak adlandırılır. Öğeler, bunları tail
özelliğiyle destekler. XML ağacındaki bir sonraki öğeye kadar öğeyi doğrudan izleyen metni içerir.
text
ve tail
iki özelliği, bir XML belgesindeki herhangi bir metin içeriğini temsil etmek için yeterlidir. Bu şekilde, ElementTree API'si , Öğe sınıfına ek olarak, (klasik DOM API'lerinden bildiğiniz gibi) sık sık yol alma eğiliminde olan özel bir metin düğümleri gerektirmez. o çıkış metin düğümlerine ağaç zorlamadan belge metni almak mümkündür dikkate alarak bu özellikleri
Uygulama
.
#!/usr/bin/env python3.3
import itertools
from pprint import pprint
try:
from lxml import etree
except ImportError:
from xml.etree import cElementTree as etree
def textAndElement(node):
'''In py33+ recursive generators are easy'''
yield node
text = node.text.strip() if node.text else None
if text:
yield text
for child in node:
yield from textAndElement(child)
tail = node.tail.strip() if node.tail else None
if tail:
yield tail
if __name__ == '__main__':
xml = '''
<species>
Mammals: <dog/> <cat/>
Reptiles: <snake/> <turtle/>
Birds: <seagull/> <owl/>
</species>
'''
doc = etree.fromstring(xml)
pprint(list(textAndElement(doc)))
#[<Element species at 0x7f2c538727d0>,
#'Mammals:',
#<Element dog at 0x7f2c538728c0>,
#<Element cat at 0x7f2c53872910>,
#'Reptiles:',
#<Element snake at 0x7f2c53872960>,
#<Element turtle at 0x7f2c538729b0>,
#'Birds:',
#<Element seagull at 0x7f2c53872a00>,
#<Element owl at 0x7f2c53872a50>]
gen = textAndElement(doc)
next(gen) # skip root
groups = []
for _, g in itertools.groupby(gen, type):
groups.append(tuple(g))
pprint(dict(zip(*[iter(groups)] * 2)))
#{('Birds:',): (<Element seagull at 0x7fc37f38aaa0>,
# <Element owl at 0x7fc37f38a820>),
#('Mammals:',): (<Element dog at 0x7fc37f38a960>,
# <Element cat at 0x7fc37f38a9b0>),
#('Reptiles:',): (<Element snake at 0x7fc37f38aa00>,
# <Element turtle at 0x7fc37f38aa50>)}
sağınızda üzerinde bakarsak ... o –
Eğer xml formatında kontrolünü var ... doğru yönde işaret etmelidir aşağı ilgili altındaki 4 benziyor?Normal olarak, Memeliler, vb. Gibi sınıflandırıcılar, xpath seçicilerinin kolayca yazılabilmesi için xml eleman isimleri veya öznitelikleri (ör.) olarak ifade edilir. –
tdelaney
Hayır, XML'yi değiştiremiyorum. – Alicia