2009-08-24 5 views
8

Gibt es eine Bibliothek, die ein xsd-Schema aus einer Java-Klasse generieren könnte? Google liefert viele Ergebnisse das Gegenteil (Java-Klassen von xsd).Pojo to xsd generation

Antwort

8

Mit JAXB 2.0 können Sie ein XML-Schema aus einer annotierten Java-Klasse erstellen.

Sie finden einige Beispiele an der AMIS blog und an der JavaPassion site.

+0

Ich soll ein JAXB-Experte sein, und das wusste ich nicht. Wie peinlich. +1 für Sie, mein Herr. – skaffman

+0

Da war eine Menge von Google-Fu beteiligt :) Kein Grund, dort überrascht zu sein. –

+0

Cool danke. Mein Google Fu ist schwach. – Surya

3

JiBX tut dies

Das Schema Generator-Tool liest zuerst eine oder mehr JiBX Bindungsdefinitionen und dann verwendet Reflektion die Struktur der Java-Klassen in den Bindungen verwiesen zu interpretieren. Durch Kombination der Bindungsdefinitionen mit die tatsächlichen Klasseninformation des Schema Generator in der Lage ist ein oder mehr XML-Schemata zu konstruieren die Dokumente, die von den Bindungen behandelt darzustellen.

3

Hier ist, wie ich es tun würde:

public void pojoToXSD(JAXBContext context, Object pojo, OutputStream out) 
    throws IOException, TransformerException 
{ 
    final List<DOMResult> results = new ArrayList<DOMResult>(); 

    context.generateSchema(new SchemaOutputResolver() { 

     @Override 
     public Result createOutput(String ns, String file) 
       throws IOException { 
      DOMResult result = new DOMResult(); 
      result.setSystemId(file); 
      results.add(result); 
      return result; 
     } 
    }); 

    DOMResult domResult = results.get(0); 
    Document doc = (Document) domResult.getNode(); 

    // Use a Transformer for output 
    TransformerFactory tFactory = TransformerFactory.newInstance(); 
    Transformer transformer = tFactory.newTransformer(); 

    DOMSource source = new DOMSource(doc); 
    StreamResult result = new StreamResult(out); 
    transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
    transformer.transform(source, result); 
} 
+0

Wohin geht das Pojo-Objekt? – FazoM

-1

Vielen Dank für Ihre Methode zu geben. Ich wollte nur ein komplettes Beispiel hinzufügen.

import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.util.ArrayList; 
import java.util.List; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.SchemaOutputResolver; 
import javax.xml.transform.OutputKeys; 
import javax.xml.transform.Result; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMResult; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 

import test.Test; 

public class Main { 
    public static void main(String[] args) throws JAXBException, 
      FileNotFoundException { 

     JAXBContext context = JAXBContext.newInstance("test"); 
     try { 
      new Main().pojoToXSD(context, new Test(), System.out); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (TransformerException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
    public void pojoToXSD(JAXBContext context, Object pojo, OutputStream out) 
      throws IOException, TransformerException 
     { 
      final List<DOMResult> results = new ArrayList<DOMResult>(); 

      context.generateSchema(new SchemaOutputResolver() { 

       @Override 
       public Result createOutput(String ns, String file) 
         throws IOException { 
        DOMResult result = new DOMResult(); 
        result.setSystemId(file); 
        results.add(result); 
        return result; 
       } 
      }); 

      DOMResult domResult = results.get(0); 
      com.sun.org.apache.xerces.internal.dom.DocumentImpl doc = com.sun.org.apache.xerces.internal.dom.DocumentImpl) domResult.getNode(); 

      // Use a Transformer for output 
      TransformerFactory tFactory = TransformerFactory.newInstance(); 
      Transformer transformer = tFactory.newTransformer(); 

      DOMSource source = new DOMSource(doc); 
      StreamResult result = new StreamResult(out); 
      transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
      transformer.transform(source, result); 
     } 
} 

//---------- below will go in test package 

package test; 

import javax.xml.bind.annotation.XmlRegistry; 
import javax.xml.namespace.QName; 




@XmlRegistry 
public class ObjectFactory { 

    private final static QName _Test_QNAME = new Name("urn:vertexinc:enterprise:calendar:1:0", "Test"); 


    public ObjectFactory() { 
    } 
    public Test createTest() { 
     return new Test(); 
    } 

    } 


    package test; 

    public class Test { 
    String name; 
    String cls; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getCls() { 
     return cls; 
    } 

    public void setCls(String cls) { 
     this.cls = cls; 
    } 

    }