2012-04-03 53 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

相關問題