2017-04-07 99 views
1

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

的[有效的方式来遍历throught XML元素(可能的复制http://stackoverflow.com/questions/4695826/高效路到迭代-throught-XML的元素) – stovfl

回答

1

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