Précédent   Forum du club des développeurs et IT Pro > Java > Général Java > XML
XML Forum API et protocoles XML en Java. Avant de poster -> FAQ Java/XML, FAQ XML
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 22/11/2012, 22h34   #1
chewbye
Invité de passage
 
Inscription : février 2012
Messages : 6
Détails du profil
Informations forums :
Inscription : février 2012
Messages : 6
Points : 1
Points : 1
Par défaut Comment parser fichier XMI

Bonjour à tous,
Je travaille actuellement sur un projet et j'ai besoin de parcourir un fichier XMI (exporté de ArgoUML).

Voici le début de mon fichier XMI:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version = '1.0' encoding = 'UTF-8' ?>
<XMI xmi.version = '1.2' xmlns:UML = 'org.omg.xmi.namespace.UML' timestamp = 'Sun Nov 18 17:50:27 GMT 2012'>
  <XMI.header>    <XMI.documentation>
      <XMI.exporter>ArgoUML (using Netbeans XMI Writer version 1.0)</XMI.exporter>
      <XMI.exporterVersion>0.34(6) revised on $Date: 2010-01-11 22:20:14 +0100 (Mon, 11 Jan 2010) $ </XMI.exporterVersion>
    </XMI.documentation>
    <XMI.metamodel xmi.name="UML" xmi.version="1.4"/></XMI.header>
  <XMI.content>
    <UML:Model xmi.id = '127-0-1-1--249a68fe:13b14925ffa:-8000:0000000000000A5D'
      name = 'untitledModel' isSpecification = 'false' isRoot = 'false' isLeaf = 'false'
      isAbstract = 'false'>
      <UML:Namespace.ownedElement>
        <UML:Package xmi.id = '127-0-1-1--249a68fe:13b14925ffa:-8000:0000000000000A5E'
          name = 'Controllers' isSpecification = 'false' isRoot = 'false' isLeaf = 'false'
          isAbstract = 'false'/>
        <UML:Class xmi.id = '127-0-1-1--249a68fe:13b14925ffa:-8000:0000000000000A5F'
          name = 'FileController' visibility = 'public' isSpecification = 'false'
          isRoot = 'false' isLeaf = 'false' isAbstract = 'false' isActive = 'false'>
J'utilise Jdom pour accéder aux différents éléments. J'arrive à accéder à l'élément XMI.content mais pas aux éléments commençant par "UML:Xxxxx".

Voici ma classe:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package models;
 
import java.io.*;
import org.jdom2.*;
import org.jdom2.input.*;
import org.jdom2.filter.*;
import java.util.List;
import java.util.Iterator;
 
public class importXMI {
 
	static org.jdom2.Document document;
	static Element root;
 
	public importXMI(File xmiFile){
		SAXBuilder sxb = new SAXBuilder();
	      try
	      {
	         //On crée un nouveau document JDOM avec en argument le fichier XML
	         //Le parsing est terminé ;)
	         document = sxb.build(xmiFile);
	      }
	      catch(Exception e){System.out.println(e.getMessage());}
 
	      //On initialise un nouvel élément racine avec l'élément racine du document.
	      root = document.getRootElement();
 
	      //Méthode définie dans la partie 3.2. de cet article
	      afficheALL();
	}
 
	//Ajouter cette méthodes à la classe JDOM2
	static void afficheALL()
	{
		System.out.println("Affichage de la liste:");
	   Namespace ns = Namespace.getNamespace("UML", "org.omg.xmi.namespace.UML");
 
	   List<Element> xmiContent = root.getChildren("XMI.content");//Retourne l'élément XMI.content
	   List<Element> xmiClass = root.getChildren("UML:Class");//Retourne une liste vide...
	   List<Element> xmiClass2 = root.getChildren("UML:Class", ns);//Retourne une liste vide...
	   List<Element> xmiClass3 = root.getChildren("Class", ns);//Retourne une liste vide...
 
	   for(int i=0; i<xmiClass.size(); i++){
		   System.out.println(i + xmiContent.get(i).getName());
	   }
 
	}
 
}
Sur beaucoup de forums j'ai cru comprendre que ce serait un problème de namespace?
J'ai pourtant récupéré le namespace dans mon code mais cela n'a rien changé.

Merci d'avance
chewbye est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2012, 23h57   #2
thelvin
Modérateur
 
Inscription : septembre 2004
Messages : 7 121
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 7 121
Points : 10 358
Points : 10 358
Envoyer un message via Skype™ à thelvin
Eh bien en fait, dans le cas présent ce n'est pas un problème de namespace. Bon, c'est ta troisième méthode qui marcherait (<Class> est dans un namespace, donc il faut vraiment indiquer un namespace. Et à côté de son namespace, son nom c'est <Class>, pas <UML:Class> ou quoi que ce soit d'autre.)
Mais elle marcherait.

Le problème c'est que <Class> n'est pas un enfant de la racine. C'est un enfant de <Namespace.ownedElement> qui est un enfant de <Model> qui est un enfant de <XMI.content>.

Le plus simple serait d'utiliser un truc comme
Code :
document.getDescendants(Filters.element("Class", ns));
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher du poisson, il videra le lac et au bout de deux ans son village ne mangera plus jamais.
Partagez vos connaissances, mais aussi comment s'en servir.
thelvin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2012, 19h23   #3
chewbye
Invité de passage
 
Inscription : février 2012
Messages : 6
Détails du profil
Informations forums :
Inscription : février 2012
Messages : 6
Points : 1
Points : 1
Je pensais qu'à partir de la racine on pouvait accéder à tous les descendants de celle-ci.
Ta méthode fonctionne parfaitement, je te remercie pour cette réponse rapide et fonctionnelle!
chewbye est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2012, 01h00   #4
thelvin
Modérateur
 
Inscription : septembre 2004
Messages : 7 121
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 7 121
Points : 10 358
Points : 10 358
Envoyer un message via Skype™ à thelvin
Citation:
Envoyé par chewbye Voir le message
Je pensais qu'à partir de la racine on pouvait accéder à tous les descendants de celle-ci.
C'est le cas, je t'ai même montré comment.
Il suffit de demander des descendants au lieu d'enfants, quand on cherche des descendants.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher du poisson, il videra le lac et au bout de deux ans son village ne mangera plus jamais.
Partagez vos connaissances, mais aussi comment s'en servir.
thelvin est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 20h16.


 
 
 
 
Partenaires

Hébergement Web