如何在python2 etree中迭代xml节点(元素和文本节点)

时间:2017-04-07 15:34:50

标签: python python-2.x

我有一个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, "")

1 个答案:

答案 0 :(得分:1)

我们可以在xpath中使用child::node()来选择上下文节点的所有子节点,无论节点类型如何。 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, "")