如何使用minidom检查Python中的标记结束?

时间:2012-04-03 19:59:53

标签: python

我正在尝试从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)

当'子节点返回'时,它会命中结束标记!。

谢谢大家!

2 个答案:

答案 0 :(得分:1)

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

1)您可以考虑将swtich设置为http://docs.python.org/library/pyexpat.html并使用xmlparser.EndElementHandler来监视结束标记。您还需要使用StartElementHandler来构建堆栈。

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

答案 1 :(得分:1)

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

你想要的只是节点的子节点(或者类型为ELEMENT_NODE的子节点)。

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

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