2012-07-30 3 views
0

J'essaye actuellement d'écrire un simple analyseur pour certains fichiers XMI (généré à partir d'un diagramme UML) mais je rencontre des problèmes lorsque j'essaie d'extraire le xmi.idref cible de cet extrait de code (je veux récupérer les éléments connectés une activité donnée, j'ai réussi à récupérer tous les bords entrants/sortants):Java DOM Parser: XMI - Inline Tag?

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

mon problème est que lorsque je tente d'extraire le UML2: CallAction, mon programme ne détecte pas comme un nœud d'élément, mais plutôt comme un nœud de texte, qui est par ailleurs vide. Voici un échantillon de ce que je fais:

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")); 

La méthode searchById travaille (je l'utilise dans différentes parties de mon code), mais si vous pensez que ce pourrait être le problème, je vais le poster. Notez que j'utilise getChildNodes plutôt que getElementsByTagName car la cible de ce bord n'est peut-être pas toujours une activité (une jointure XOR/Merge Node par exemple). L'erreur exacte est:

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

Lorsque je tente de lancer « cible » à Element ... Je suppose que cela provient du fait qu'il est une balise « en ligne », mais je ne sais pas comment la traiter, être un débutant à l'analyse syntaxique ...

Merci pour votre aide,

Hervé

Edit: J'ai essayé en remplaçant les GetChildNodes par getElementsByTagName et il semble fonctionner ... Cependant, si quelqu'un pouvait corriger le code ci-dessus ou au moins expliquer pourquoi il ne fonctionnera pas correctement, que woul d être génial.

Répondre

2

En résumé, vous faites une mauvaise supposition que getChildNodes() renvoie uniquement XML Element s; il ne renvoie pas les autres types de nœuds, y compris les nœuds de texte qui représentent les espaces et les retours à la ligne entre les éléments qui vous intéressent.

Si vous voulez appeler getChildNodes() et traiter tous les nœuds, alors vous besoin de faire une boucle sur tous les nœuds retournés, et regarder chacun d'eux pour déterminer quel genre de nœud il est, et le traiter en conséquence. Si vous ne voulez pas faire cela, alors quelque chose comme getElementsByTagName() est l'alternative.

+0

Merci, juste ce que je n'ai pas compris ... Une boucle rapide a résolu mes problèmes! – anonymous2339901