如何获取 cElementTree 中元素的所有文本子元素?

How to get all text children of an element in cElementTree?

我正在使用 Python 中的 cElementTree 模块获取 XML 树的文本子节点,使用 text 属性。但它似乎只适用于直接文本子项(见下文)。

$ 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 模块?

使用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']

更新

要获取直接文本子节点,您还需要访问 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']