0

我正在尝试从 XML 创建一个表达式。从顶部节点读取我想将节点一个接一个地放入堆栈,一旦我点击一个结束标记,我想弹出堆栈中的所有元素。如何检查标签的结尾?

TIA,

约翰

回答:

好的,我想我有解决方案,使用这样的递归函数:

def findTextNodes(nodeList):
    for subnode in nodeList:
        if subnode.nodeType == subnode.ELEMENT_NODE:
            print("element node: ",subnode.tagName)
            # call function again to get children
            findTextNodes(subnode.childNodes)
            print('subnode return: ', subnode.tagName)
        elif subnode.nodeType == subnode.TEXT_NODE:
            print("text node: ",subnode.data)

当“子节点返回”时,它会碰到结束标签!。

谢谢大家!。

4

2 回答 2

1

minidom构建一个 DOM。DOM 中没有标签,因为 XML 已完全解析为节点。DOM 中的一个节点代表整个 XML 元素。

听起来你想要的只是节点的孩子(或者ELEMENT_NODE可能是类型的孩子)。

由于您正在谈论将它们推入堆栈并将它们从堆栈中弹出,因此听起来您希望它们与它们在文档中出现的顺序相反。在这种情况下,您可能想要类似reversed([child for child in node.childNodes if child.nodeType == child.ELEMENT_NODE]).

如果您想要所有孩子(包括节点的孩子的孩子等等),那么递归解决方案是最简单的。

于 2012-04-03T20:35:29.110 回答
1

minidom 在内存中构建整个 DOM。因此它不会在遇到结束标签时通知您

1)您可以考虑切换到http://docs.python.org/library/pyexpat.html并使用 xmlparser.EndElementHandler 来观察结束标记。您还需要使用 StartElementHandler 来构建您的堆栈。

2) 利用 minidom 生成的 DOM 树:只需从中选择节点。(不使用任何堆栈)

于 2012-04-03T20:09:36.283 回答