2012-04-03 36 views
0

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

TIA,

约翰

答:

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

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) 

当“子节点返回'它结束标签!

谢谢大家!

回答

1

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

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

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

+0

嘿安东尼,1)不幸的是,这是一个继承的项目,我现在无法更改为其他模块。 2)XML格式不具有静态格式,可以是任何重复的格式。 – JohnX 2012-04-03 20:12:55

+0

@JohnX如果是这样的话,你可能想检查一下这个:http://stackoverflow.com/questions/1596829/xml-parsing-with-python-and-minidom – 2012-04-03 20:38:42

+0

谢谢安东尼!我编辑了我的帖子以包含解决方案。 – JohnX 2012-04-03 21:09:30

1

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

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

由于您正在讨论将它们推到堆栈上并将它们弹出堆栈,这听起来像您希望它们与它们在文档中出现的顺序相反。在这种情况下,您可能需要诸如reversed([child for child in node.childNodes if child.nodeType == child.ELEMENT_NODE])之类的东西。

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

+0

是的,我认为它有像libXml XML_ELEMENT_DECL但它不,无论如何,我想我已经找到了解决方案。非常感谢Kindall! – JohnX 2012-04-03 21:09:02