我有一个xml,其中元素包含多个文本节点。使用 python2 etree
,我想以相同的顺序导航树。
因此,对于此输入:
<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, "")
我们可以在 xpath 中使用child::node()
来选择上下文节点的所有子节点,无论它们的节点类型如何。在此处阅读有关它的信息。因此,将 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, "")