我正在尝试从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)
当'子节点返回'时,它会命中结束标记!。
谢谢大家!
答案 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])
。
如果你想要所有孩子(包括节点的孩子的孩子等),那么递归解决方案是最简单的。