現在、いくつかのXMIファイル(UML図から生成)の単純なパーサーを作成しようとしていますが、このコードスニペットからターゲットxmi.idrefを抽出しようとするといくつかの問題が発生します(特定の要素に接続された要素を取得したいアクティビティ、すべての着信/発信エッジを正常に取得しました):
<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メソッドは機能しています(コードのさまざまな部分で使用しています)が、問題があると思われる場合は投稿します。このエッジのターゲットが常にアクティビティであるとは限らないため(たとえば、XOR結合/マージノード)、getElementsByTagNameではなくgetChildNodesを使用することに注意してください。正確なエラーは次のとおりです。
com.sun.org.apache.xerces.internal.dom.DeferredTextImpl cannot be cast to org.w3c.dom.Element
'target'をElementにキャストしようとすると...これは「インライン」タグであるという事実から来ていると思いますが、解析の初心者であるため、どのように処理するのかわかりません...
ご協力いただきありがとうございます、
エルベ
編集:getChildNodesをgetElementsByTagNameに置き換えてみましたが、うまくいくようです...しかし、誰かが上記のコードを修正するか、少なくとも正しく機能しない理由を説明できれば、それは素晴らしいことです。