如何迭代python2 etree中的xml节点(包括元素和文本节点)
问题描述:
我有一个xml,其中一个元素包含多个文本节点。使用python2 etree
,我想用相同的顺序导航树。如何迭代python2 etree中的xml节点(包括元素和文本节点)
所以,对于这个输入:
<body>
hello
<b>world</b>
bye
</body>
我需要能够产生这种输出严格按照此顺序:
tag: body
text: hello
tag: b
text: world
text: bye
不过,我不etree
功能看在元素和文本节点上迭代。
我该怎么做? 我在寻找的东西,如(功能iterateElementsAndTextNodes
不存在):
from lxml import etree
import utils
doc = etree.XML("""<body>hello<b>world</b>bye</body>""")
def printNode(node, prefix):
if isinstance(node, str):
print prefix + "text: " + node
else:
print prefix + "tag:" + node.tag
for c in node.iterateElementsAndTextNodes():
printNode(c, prefix + " ")
printNode(doc, "")
答
我们可以使用child::node()
在XPath来选择上下文节点的所有儿童,无论其节点类型。 Read about it here. 所以,改变for循环:
for c in node.xpath("child::node()"):
printNode(c, prefix + " ")
代码:
from lxml import etree
import utils
doc = etree.XML("""<body>hello<b>world</b>bye</body>""")
#print "doc is", etree.tostring(doc)
def printNode(node, prefix):
if isinstance(node, etree._ElementStringResult):
print prefix + "text: " + node
else:
print prefix + "tag: " + node.tag
for c in node.xpath("child::node()"):
printNode(c, prefix + " ")
printNode(doc, "")
的[有效的方式来遍历throught XML元素(可能的复制http://stackoverflow.com/questions/4695826/高效路到迭代-throught-XML的元素) – stovfl