2015-12-12 230 views
2

我在Python中使用cElementTree模塊來獲取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' 
>>> 

是否有可能獲取給定元素的所有立即文字兒童使用cElementTree模塊(也許作爲一個清單,在上面的例子中,即['More text']['Text 1', 'Text 2', 'Text 3'])?

回答

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

見我的編輯 - 我只是想以檢索* immediate *文本子元素,所以結果是兩個例子的'['More text']'和'['Text 1',''Text 2','Text 3']'。 – Sumit

+0

@Sumit,感謝您的反饋。我相應地更新了答案。 – falsetru

相關問題