0

現在、いくつかの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に置き換えてみましたが、うまくいくようです...しかし、誰かが上記のコードを修正するか、少なくとも正しく機能しない理由を説明できれば、それは素晴らしいことです。

4

1 に答える 1

2

getChildNodes()つまり、 XMLのみを返すという悪い仮定をしているElementのです。そうではなく、関心のある要素間の空白や改行を表すテキストノードなど、他の種類のノードも返します。

すべてのノードを呼び出しgetChildNodes()て処理する場合は、返されたすべてのノードをループし、各ノードを調べてノードの種類を判別し、それに応じて処理する必要があります。これを行いたくない場合は、次のようなものgetElementsByTagName()が代わりになります。

于 2012-07-30T04:30:24.927 に答える