XMI parsing

di il
7 risposte

XMI parsing

Ciao a tutti,
dovrei effettuare un applicazione in java che effettua il parsing di un documento xmi e che stampa su un file classi e relativi attributi del file xmi( e di conseguenza del relativo file uml da cui l'xmi è stato estratto).Qualcuno ha qualche esempio che potrebbe aiutarmi?grazie milla

7 Risposte

  • Re: XMI parsing

    Dova sta il problema?

    xsi e' un formato xml, sul sito della omg trovi il pdf che ne descrive la struttura e a che cosa serve, su wikipedia trovi una breve spiegazione di che cosa e', di parser xml in java ne trovi quanti vuoi.

    I vari tool UML (altova, visip, ...) importano ed esportano in xmi ...

    Quindi?
    Sii piu' specifico, se ti serve un aiuto ...
  • Re: XMI parsing

    Ciao grazie per la risposta.Questa notte c'ho lavorato un pò su e ho buttato giù questo codice
    
    // DOMRead.java
    import org.apache.xerces.parsers.*;
    import org.w3c.dom.*;
    import org.w3c.dom.traversal.*;
    
    // This program creates a DOM tree for the file specified as a command
    // line option and demonstrates the use of a NodeFilter to obtain the
    // Element nodes corresponding to objects in an XMI document.
    public class DOMRead {
    		
    // Return the nodes that represent objects; the "visibility" attribute
    // is optional, and XMI extension elements may have "xmi:id"
    // attributes too, so this filter will not work for every XMI
    // file, but it is good enough for the DOM example in this chapter.
    private static class ObjectFilter implements NodeFilter {
    	public short acceptNode(Node n) {
    		if (n.getNodeType() == Node.ELEMENT_NODE) {
    				Element e = (Element) n;
    					if (e.getAttributeNode("visibility") != null)
    							return NodeFilter.FILTER_ACCEPT;
    		}
    		return NodeFilter.FILTER_REJECT;
    	}
    }
    
    public static void main(String[] args) throws Exception {
    
    DOMParser parser = new DOMParser();
    parser.parse("file.xmi");
    Document d = parser.getDocument();
    DocumentTraversal dt = (DocumentTraversal) d;
    //Create the NodeIterator with the filter created above. The
    //NodeIterator will apply the filter before returning the next node.
    NodeIterator it = dt.createNodeIterator(d.getDocumentElement(),NodeFilter.SHOW_ALL,new ObjectFilter(),true);
    Node n = it.nextNode();
    	
    	while (n != null) {
    			writeObject(n);
    				n = it.nextNode();
    	}
    }
    //Write the name of the Element node and the XML attributes and
    //their values.
    public static void writeObject(Node object) {
    				
    	System.out.println(object.getNodeName().substring(4) + ":");
    
    		NamedNodeMap attribs = object.getAttributes();
    
    			for (int j = 0; j < attribs.getLength(); j++)
    					System.out.println(" " + attribs.item(j).getNodeName() +":" + attribs.item(j).getNodeValue());
    
     
    	}
    
    }
    
    Il problema è che dovrei stampare su un file solo classi e relativi attributi,mentre al momento stampo tutte le informazioni contenute in ogni nodo.Come posso effettuare una selezione delle sole informazioni che mi servono?Grazie(di seguito il file di output)
    
    Class:
     isAbstract:false
     isActive:false
     isLeaf:false
     isRoot:false
     isSpecification:false
     name:Table
     namespace:UMLModel.4
     participant:UMLAssociationEnd.16 UMLAssociationEnd.19 UMLAssociationEnd.20 UMLAssociationEnd.22
     visibility:public
     xmi.id:UMLClass.7
    Attribute:
     changeability:changeable
     isSpecification:false
     name:Type
     owner:UMLClass.7
     ownerScope:instance
     targetScope:instance
     type:
     visibility:public
     xmi.id:UMLAttribute.8
    Attribute:
     changeability:changeable
     isSpecification:false
     name:Comp
     owner:UMLClass.7
     ownerScope:instance
     targetScope:instance
     type:
     visibility:public
     xmi.id:UMLAttribute.9
    Attribute:
     changeability:changeable
     isSpecification:false
     name:DT
     owner:UMLClass.7
     ownerScope:instance
     targetScope:instance
     type:
     visibility:public
     xmi.id:UMLAttribute.10
    Class:
     isAbstract:false
     isActive:false
     isLeaf:false
     isRoot:false
     isSpecification:false
     name:Project
     namespace:UMLModel.4
     participant:UMLAssociationEnd.17 UMLAssociationEnd.23 UMLAssociationEnd.57 UMLAssociationEnd.60 UMLAssociationEnd.69 UMLAssociationEnd.72 UMLAssociationEnd.75
     visibility:public
     xmi.id:UMLClass.11
    Attribute:
     changeability:changeable
     isSpecification:false
     name:Name
     owner:UMLClass.11
     ownerScope:instance
     targetScope:instance
     type:
     visibility:public
     xmi.id:UMLAttribute.12
    Attribute:
     changeability:changeable
     isSpecification:false
     name:A
     owner:UMLClass.11
     ownerScope:instance
     targetScope:instance
     type:
     visibility:public
     xmi.id:UMLAttribute.13
    Attribute:
     changeability:changeable
     isSpecification:false
     name:Y
     owner:UMLClass.11
     ownerScope:instance
     targetScope:instance
     type:
     visibility:public
     xmi.id:UMLAttribute.14
    
  • Re: XMI parsing

    In che senso come fai?

    Il tuo codice attuale tratta il documento XMI semplicemente come un documento XML.

    Invece devi aggiungere la semantica ai nodi XML che stai navigando.

    Come si fa?

    Carta e matita !

    Oppure puoi tentare in questo modo: usi uno stylesheet per convertire la struttura del documento XMI in un file XML avente i nomi dei tag del tipo:

    'class'
    'method'
    'field'
    'type'

    ...

    In questo modo ti risulterebbe evidente chi sono le classi, chi i metodi, ...
    Ma mi sa che andiamo molto oltre ...
  • Re: XMI parsing

    Cosa intendi quindi per "aggiungere la semantica ai nodi XML che stai navigando"?Grazie
  • Re: XMI parsing

    CIao a tutti,
    ho modificato il codice in questo modo:
    
    import java.io.File;
    
    import org.w3c.dom.*;
    //classe che permette di creare un albero a partire da un file xml
    import javax.xml.parsers.DocumentBuilderFactory;
    //classe che permette di ottenere a partire da un xml un document che rappresenta il file xml
    import javax.xml.parsers.DocumentBuilder;
    
    import org.xml.sax.SAXException;
    import org.xml.sax.SAXParseException;
     
    
    
    
    import java.lang.String;
     
    public class parser {
     
        final static String ATTRIBUTI = "UML:Attribute";
        final static String METODI = "UML:Operation";
        final static String CLASSI = "UML:Class"; 
        final static String FILE_ADDRESS = "FP_CFP_tool_v2.xmi";
     
        public static void main(String args[]) {
        	NodeList listClass;
        	NodeList listATTRIBUTI;
            try {
     
                DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
                Document doc = docBuilder.parse(new File(FILE_ADDRESS));
     
                 listClass = doc.getElementsByTagName(CLASSI);
                 
                int totalClass = listClass.getLength();
                System.out.println("Total Class : " + totalClass);
             
               for (int i = 0; i < listClass.getLength(); i++) {
            	   
                   Element link = (Element) listClass.item(i);
                   
                   System.out.println("Class= "+ link.getAttribute("name"));
    
               }
               // stampa attributi 
                
                listATTRIBUTI = doc.getElementsByTagName(ATTRIBUTI);
                
                int totalATTRIBUTI = listATTRIBUTI.getLength();
                System.out.println("Attribute:"+totalATTRIBUTI);
                
     
                NodeList linksAtributesHiding = doc.getElementsByTagName(ATTRIBUTI);
                for (int i = 0; i < linksAtributesHiding.getLength(); i++) {
     
                    Element link = (Element) linksAtributesHiding.item(i);
     
                    System.out.println("Attribute= " + link.getAttribute("name"));
     
                }
                
     
            } catch (SAXParseException err) {
                System.out.println("** Parsing error" + ", line "
                        + err.getLineNumber() + ", uri " + err.getSystemId());
                System.out.println(" " + err.getMessage());
     
            } catch (SAXException e) {
                Exception x = e.getException();
                ((x == null) ? e : x).printStackTrace();
     
            } catch (Throwable t) {
                t.printStackTrace();
            }
            
            
        }
    }
    
    
    In pratica ottengo due liste,una contenente tutte le classi,mentre l'altra tutti gli attributi.Il mio obiettivo però è riuscire a stampare le classi con i rispettivi attributi,ovvero questo:
    Tipo | Valore
    Classe | Persona
    Attributo |Nome
    Attributo | Cognome
    Classe |Auto
    Attributo | marca
    Come posso riuscire ad ottenere questo risultato partendo da due liste contenenti una attributi e l'altra classi?
    Grazie a tutti
  • Re: XMI parsing

    salvogsm80 ha scritto:


    Come posso riuscire ad ottenere questo risultato partendo da due liste contenenti una attributi e l'altra classi?
    Infatti non devi ragionare con liste separate .... altrimenti non ne esci.
    Premetto che non conosco questi file XMI ma posso farmi una idea in base al tuo codice.
    Immagino che ad esempio i tag UML:Attribute siano "dentro" (direttamente o qualche livello più innestato) i tag UML:Class.
    Bene, se è così basta che per ogni tag UML:Class vai a prendere i tag UML:Attribute, cioè proprio partendo dal tag della classe .... non dal document!

    Abbozzo del codice (non ho tempo ora di indagare oltre e/o provare):
    NodeList classesList = doc.getElementsByTagName("UML:Class");
    
    for (int i = 0; i < classesList.getLength(); i++) {
        Element classElement = (Element) classesList.item(i);
                   
                               // su classElement !! non su doc
        NodeList attributesList = classElement.getElementsByTagName("UML:Attribute");
    
        for (int j = 0; j < attributesList.getLength(); j++) {
            // ........
        }
    }
  • Re: XMI parsing

    Grazie mille,sono riuscito a risolvere come mi avevi consigliato!!!Adesso provo a stampare il tutto su un file!Grazie ancora sei stato gentilissimo e disponibilissimo
Devi accedere o registrarti per scrivere nel forum
7 risposte