tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
8
ZUGRIFFE
4980
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    martinsig martinsig ist offline Mitglied
    Registriert seit
    Oct 2005
    Beiträge
    15
    Hallo,

    ich muss ein xsd file in java einlesen und als ein jTree darstellen.
    Achtung. Kein xml file! Es ist ein xsd file.
    Mit welchem Parser geht denn das am besten?
    Wie sollte ich am besten vorgehen.

    Vielleicht kennt es ja jemand. Es sollte so wie in oXygen aussehen, wenn man sich eine xsd Datei in der logischen Baumdarstellung ansieht.

    Vielen vielen Dank
     

  2. #2
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    Eine XML Schema Definition wird selbst in XML notiert. Ein XML-Parser wird also das tun was du möchtest.
     

  3. #3
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    Hallo,

    ein XSD-File ist auch ein XML-File, also müsste es mit einem normalen XML-Parser funktionieren.

    http://www.tutorials.de/forum/java/1...-abbilden.html

    Wie der Baum letztendlich aussehen soll, musst du mir einem CellRenderer definieren.

    MFG

    zEriX
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  4. #4
    martinsig martinsig ist offline Mitglied
    Registriert seit
    Oct 2005
    Beiträge
    15
    Hallo,

    danke für die schnellen Antworten. Mein problem liegt darin wie ich den Baum am geschicktesten zusammenbau. Da es sich um eine xsd Datei handelt, ist die Struktur nicht wirklich als eine Baumstruktur erkennbar.
    Ich will mal ein Beispiel geben wie ich einige xsd elemente als Baum darstellen würde.
    ...
    <xs:complexType name="Person">
    <xs:sequence>
    <xs:element name="Vorname" type="String" />
    <xs:element name="Nachname" type="String" />
    </xs:sequence>
    </xs:complexType>
    ...
    <xs:complexType name="Gruppe">
    <xs:sequence>
    <xs:element name="Mitglied" type="Person" />
    <xs:element name="GruppenName" type="xs:String" />
    </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Haus">
    <xs:sequence>
    <xs:element name="Bewohner" type="Person" />
    <xs:element name="Hausnummer" type="xs:Integer" />
    </xs:sequence>
    </xs:complexType>

    Daraus würde ich gern folgenden baum haben:
    HTML-Code:
     root + Person 
                     + Vorname
                     + Nachname
            + Gruppe
                      + Person 
                                  + Vorname
                                  + Nachname
                     + Gruppenname
            + Haus
                     + Person
                                  +Vorname
                                  +Nachname
                    + Hausnummer
    Vielen Dank.
    Schöne Grüße
     

  5. #5
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    Erstmal solltest du dir eine Datenstruktur überlegen in welche du die geparsten Daten ablegen kannst so dass du sie später leicht in einen Baum umwandeln kannst.

    Sind die Daten fertig geparst gehst fängst du an den Baum aufzubauen. Dabei schaust du bei jedem Element im Typ nach ob dies ein Standardtyp ist oder ob dieser in deinen geparsten Daten zu finden ist (Name als Key und Objekt als Value in eine HashMap z.B.). Ist dies der Fall nutzt du die Daten des gefundenen Typs im Baum.
     

  6. #6
    kw4nta kw4nta ist offline Grünschnabel
    Registriert seit
    Dec 2011
    Beiträge
    2
    Zitat Zitat von martinsig Beitrag anzeigen
    Hallo,

    ich muss ein xsd file in java einlesen und als ein jTree darstellen.
    Achtung. Kein xml file! Es ist ein xsd file.
    Mit welchem Parser geht denn das am besten?
    Wie sollte ich am besten vorgehen.

    Vielleicht kennt es ja jemand. Es sollte so wie in oXygen aussehen, wenn man sich eine xsd Datei in der logischen Baumdarstellung ansieht.

    Vielen vielen Dank

    XSD kann man mit Xerxes einlesen (+ zugehöriges XML)

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    
     
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URI;
    import java.net.URISyntaxException;
    import java.net.URL;
     
    import javax.xml.XMLConstants;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.transform.Source;
    import javax.xml.transform.stream.StreamSource;
    import javax.xml.validation.Schema;
    import javax.xml.validation.SchemaFactory;
     
    import org.apache.xerces.xs.ElementPSVI;
    import org.apache.xerces.xs.XSAnnotation;
    import org.apache.xerces.xs.XSElementDeclaration;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.xml.sax.SAXException;
     
    public final class DocumentManager
    {
        Document loadDocument(String documentURL) throws Exception
        {
            
            InputStream in = new URL(documentURL).openStream();
            Document doc = builder.parse(in);
            in.close();
            if (!doc.getDocumentElement().isSupported("psvi", "1.0"))
                throw new Exception("apache xerxes psvi not supported");
            return doc;
        }
        
        DocumentBuilderFactory dbf;
        DocumentBuilder builder;
        
        public DocumentManager(String schemaURL) throws Exception
        {
            // Builder parser = new Builder(false);
            // Document doc = parser
            // .build(new File(
            // new URI(
            // "file:///C:/developer/workspace/2011-11-23%20rulesmanager%20prototype/mapping-schema.xsd")));
            // Element root = doc.getRootElement();
            // Load up the document
            dbf = DocumentBuilderFactory.newInstance();
            
            // dbf is JAXP DocumentBuilderFactory
            
            // all of the following features must be set:
            dbf.setNamespaceAware(true);
            dbf.setValidating(true);
            dbf.setAttribute("http://apache.org/xml/features/validation/schema",
                    Boolean.TRUE);
            
            // you also must specify Xerces PSVI DOM implementation
            // "org.apache.xerces.dom.PSVIDocumentImpl"
            dbf.setAttribute(
                    "http://apache.org/xml/properties/dom/document-class-name",
                    "org.apache.xerces.dom.PSVIDocumentImpl");
            
            // Set up an XML Schema validator, using the supplied schema
            ;
            InputStream in = new URL(schemaURL).openStream();
            Source schemaSource = new StreamSource(in);
            SchemaFactory schemaFactory = SchemaFactory
                    .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Schema schema = schemaFactory.newSchema(schemaSource);
            
            // Instead of explicitly validating, assign the Schema to the factory
            dbf.setSchema(schema);
            
            // Parsers from this factory will automatically validate against the
            // associated schema
            builder = dbf.newDocumentBuilder();
            in.close();
        }
        
        Document createDocument() throws Exception
        {
            Document doc = builder.newDocument();
            if (!doc.getDocumentElement().isSupported("psvi", "1.0"))
                throw new Exception("apache xerxes psvi not supported");
            return doc;
        }
    }
     
     
    //use like
     
            DocumentManager m = new DocumentManager(
                    "schema.xsd");
    //jetzt entweder passendes XML laden
            Document d = m
                    .loadDocument("document.xml");
            String ns = d.getDocumentElement().getNamespaceURI();
            ElementPSVI e = (ElementPSVI) d.getElementsByTagNameNS(ns, "if-rule")
                    .item(0);
            XSElementDeclaration decl = e.getElementDeclaration();
    //oder Dokument erzeugen
     
            Document d = m
                    .createDocument();
     
            ElementPSVI e = (ElementPSVI) d.createElementNS("your-namespace", "root-element-tag");
     
    //et voilà: die Deklaration des root Elements.
            XSElementDeclaration  decl = e.getElementDeclaration();
    Jetzt musst du dich nur noch in die XSAPI von Xerces einarbeiten.

    Greetz
    Kwanta
     

  7. #7
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.161
    Moin,

    Zitat Zitat von kw4nta Beitrag anzeigen
    XSD kann man mit Xerxes einlesen (+ zugehöriges XML)

    Jetzt musst du dich nur noch in die XSAPI von Xerces einarbeiten.
    na, ob er das nach über 4 Jahren noch möchte ....... ich weiß es nicht ......

    Gruß
    Klaus
     
    Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!

    Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
    -------------------------------------------------------------------------------------------------
    Ich beantworte keine Fragen per PN !!
    Stellt Eure Fragen im Forum - dann haben alle etwas davon !!

  8. #8
    kw4nta kw4nta ist offline Grünschnabel
    Registriert seit
    Dec 2011
    Beiträge
    2
    Ich habe ewig nach dieser Lösung gesucht, bin unter anderem auch auf diesen Post gestoßen. Deshalb hab ich gedacht, ich poste mal meine Lösung. Hätte vielleicht was zum Datum sagen sollen :-P
     

  9. #9
    Avatar von schnuffie
    schnuffie schnuffie ist offline Mitglied Platin
    Registriert seit
    Oct 2004
    Ort
    Ober-Roden (Hessen)
    Beiträge
    725
    Eine XSD mit einem XML-Parser einzulesen und als Baum auszugeben, erfordert viel "Handarbeit". Ich würde aus der XSD mit JAXB-Tool die Klassen generieren lassen: "jaxb\bin\xjc.bat schoko.xsd -d src -p jaxb.schoko.generated", siehe dazu auch http://www.tutorials.de/java/224045-...erstellen.html.

    Durch die Beziehungen zwischen den Klassen kannst Du diese optimal für den Aufbau des Baums benutzen.
     
    CU schnuffie

    Fragliche Fragen stellende Fragensteller sind für verantwortungslose Antworten antwortender verantwortlicher Antworter selbst verantwortlich.

Ähnliche Themen

  1. JTree aus Collection von File-Objekten erstellen
    Von Martin240 im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 3
    Letzter Beitrag: 27.09.10, 14:44
  2. XML file als Tree in SWT darstellen
    Von GRU_EGO im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 6
    Letzter Beitrag: 06.01.07, 01:08
  3. JTree - Blatt als Knoten darstellen
    Von Haruka im Forum Java
    Antworten: 2
    Letzter Beitrag: 01.09.05, 16:35
  4. Unicode aus Datei lesen und darstellen?
    Von Math55 im Forum Java
    Antworten: 1
    Letzter Beitrag: 05.08.05, 13:56
  5. Bild(er) aus DB lesen/darstellen
    Von markberg im Forum PHP
    Antworten: 4
    Letzter Beitrag: 16.07.05, 11:13