2015-12-12 1 views
2

Я использую модуль cElementTree в Python, чтобы получить текстовое дочернее дерево XML, используя свойство text. Но, похоже, это работает только для непосредственного текста детей (см. Ниже).Как получить все текстовые элементы элемента в cElementTree?

$ python 
... 
>>> import xml.etree.cElementTree as ET 
>>> root = ET.XML('<root><elm key="value">Some text</elm>More text</root>') 
>>> root.text 
>>> root = ET.XML('<root>Text 1<elm key="value">Text</elm>Text 2<elm2 />Text 3</root>') 
>>> root.text 
'Text 1' 
>>> 

Можно ли получить все немедленные текста детей данного элемента (может быть в виде списка, т.е. ['More text'] и ['Text 1', 'Text 2', 'Text 3'] в приведенных выше примерах), используя cElementTree модуль?

ответ

2

Использование xml.etree.ElementTree.Element.itertext:

>>> import xml.etree.cElementTree as ET 
>>> root = ET.XML('<root><elm key="value">Some text</elm>More text</root>') 
>>> list(root.itertext()) 
['Some text', 'More text'] 
>>> root = ET.XML('<root>Text 1<elm key="value">Text</elm>Text 2<elm2 />Text 3</root>') 
>>> list(root.itertext()) 
['Text 1', 'Text', 'Text 2', 'Text 3'] 

UPDATE

Чтобы получить немедленный текст детей, вы также должны получить доступ к tail дочерних узлов:

>>> root = ET.XML('<root><elm key="value">Some text</elm>More text</root>') 
>>> ([root.text] if root.text else []) + [child.tail for child in root] 
['More text'] 
>>> root = ET.XML('<root>Text 1<elm key="value">Text</elm>Text 2<elm2 />Text 3</root>') 
>>> ([root.text] if root.text else []) + [child.tail for child in root] 
['Text 1', 'Text 2', 'Text 3'] 
+0

Смотрите мой выбор - я только хочу для извлечения * немедленных * текстовых детей, поэтому результатом является «[« Больше текста ») и« [Текст 1 »,« Текст 2 »,« Текст 3 »] для двух примеров. – Sumit

+0

@Sumit, Благодарим вас за отзыв. Я соответствующим образом обновил ответ. – falsetru

Смежные вопросы