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

标签 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, "")

最佳答案

我们可以在 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, "")

关于python - 如何在 python2 etree 中迭代 xml 节点(元素和文本节点),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43282032/

相关文章:

python - 使用 Python 从 sqlite3 DB 中提取值

python - 如何使用 python suds 为工厂创建的简单类型对象赋值?

Python:使用变量名占位符格式化字符串

python - 动态转义字符串中的 % 符号和方括号 { }

python - Python 2.x 中的字符串使用哪种编码?

python - python中的反向排序和argsort

python - 如何从列表中删除第一项?

python-3.x - Visual Studio 2015 ( v 14) 中缺少 python 编译所需的 vcvarsall.bat

python - 将 txt 文件转换为 int 数组

python - python中的凯撒密码