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



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

最新更新