Discussion: Comment parser fichier XMI [JDOM]

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    février 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2012
    Messages : 6
    Points : 8
    Points
    8

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

    Profil pro
    Inscrit en
    septembre 2004
    Messages
    10 925
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 10 925
    Points : 18 457
    Points
    18 457

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    document.getDescendants(Filters.element("Class", ns));
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    février 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2012
    Messages : 6
    Points : 8
    Points
    8

    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

    Profil pro
    Inscrit en
    septembre 2004
    Messages
    10 925
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 10 925
    Points : 18 457
    Points
    18 457

    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.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. comment parser un fichier.doc
    Par noustre dans le forum VB.NET
    Réponses: 1
    Dernier message: 04/03/2008, 14h54
  2. Comment parser un fichier texte en batch ?
    Par arnaudperfect dans le forum Scripts/Batch
    Réponses: 0
    Dernier message: 20/11/2007, 10h07
  3. Comment parser un fichier.txt sous Access?
    Par takepaf dans le forum VBA Access
    Réponses: 5
    Dernier message: 31/05/2007, 12h15
  4. [DOM4J] Comment parser un fichier xml avec dom4j
    Par taouja dans le forum XML
    Réponses: 3
    Dernier message: 12/04/2007, 08h47
  5. [XML] Comment parser ce fichier XML avec java !
    Par jlassira dans le forum XML
    Réponses: 7
    Dernier message: 13/03/2006, 13h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo