2012-07-30 44 views
0

我目前正在嘗試爲一些XMI文件編寫簡單的解析器(從UML圖生成),但是當我嘗試從此代碼片段中提取目標xmi.idref時遇到了一些問題(我想要檢索連接的元素一個給定的活動,我已經成功地檢索到的所有呼入/呼出邊緣):Java DOM解析器:XMI - 內聯標記?

<UML2:ActivityEdge xmi.id = 'I6bf577d1m1387a6c0ea1mm7dcb' visibility = 'public' is Specification = 'false'> 
    <UML2:ActivityEdge.target> 
     <UML2:CallAction xmi.idref = 'I6bf577d1m1387a6c0ea1mm7dda'/> 
    </UML2:ActivityEdge.target> 

我的問題是,當我嘗試提取UML2:CallAction,我的程序沒有檢測到它作爲一個元素節點而是作爲一個文本節點,這是空的方式。下面是我做的一個樣本:

Element edge = searchById(doc,"UML2:ActivityEdge",id); 
     Element group = (Element) edge.getElementsByTagName("UML2:ActivityEdge.target").item(0); 
     Node target = group.getChildNodes().item(0); 
     Element targetRef = (Element) target; 
     Element t = searchById(doc,targetRef.getNodeName(),targetRef.getAttribute("xmi.idref")); 
     nameList.add(t.getAttribute("name")); 

的searchById方法的工作(我用它在我的代碼各部分),但如果你認爲它可能是這個問題,我會後它。請注意,我使用getChildNodes而不是getElementsByTagName,因爲此邊的目標可能不總是一個活動(例如XOR連接/合併節點)。確切的錯誤是:

com.sun.org.apache.xerces.internal.dom.DeferredTextImpl cannot be cast to org.w3c.dom.Element 

當我嘗試投「目標」來元......我想這來自於一個事實,這是一個「內聯」的標籤,但我不知道如何對待它,處於解析初學者...

感謝您的幫助,

埃爾韋

編輯:我試圖通過的getElementsByTagName更換getChildNodes,它似乎工作...但是,如果有人可以糾正上面的代碼或者至少可以解釋爲什麼它不能正常工作,那就是woul d太棒了。

回答

2

總之,你做了一個壞的假設,getChildNodes()只返回XML Element s;它沒有,它返回其他類型的節點,以及包括代表你感興趣的元素之間的空格和換行文本節點。

如果你想打電話getChildNodes()和處理所有的節點,那麼你需要遍歷所有返回的節點,並查看每個節點以確定它是什麼類型的節點,並相應地處理它。如果你不想這樣做,那麼像getElementsByTagName()是另一種選擇。

+0

謝謝,就是我不明白的......快速循環解決了我的問題! – anonymous2339901 2012-07-30 05:12:22