+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Invité de passage
    Inscrit en
    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

  2. #2
    Modérateur

    Inscrit en
    septembre 2004
    Messages
    9 952
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 9 952
    Points : 16 521
    Points
    16 521

    Par défaut

    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.

  3. #3
    Invité de passage
    Inscrit en
    février 2012
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : février 2012
    Messages : 6
    Points : 1
    Points
    1

    Par défaut

    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!

  4. #4
    Modérateur

    Inscrit en
    septembre 2004
    Messages
    9 952
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 9 952
    Points : 16 521
    Points
    16 521

    Par défaut

    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.

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •