Comment créer un fichier XSD à l'aide de données XML en java


J'ai une donnée XML comme

<Data><CustomerDetails><CustomerName>ABCD</CustomerName><CusomerACCTNumber>12121212</CusomerACCTNumber></CustomerDetails><BillDetails><BillTxDetails><BillID>121212</BillID><BillDate>12-May-2015</BillDate><Time>12:55AM</Time></BillTxDetails><BillTxDetails><BillID>121212</BillID><BillDate>12-May-2015</BillDate><Time>5:55AM</Time></BillTxDetails></BillDetails></Data>

Comment créer un fichier xsd en utilisant java? et comment créer une classe java (pojo/bean) pour les données xml ci-dessus? J'ai essayé de cette façon

public class CustomerDetails {
  private String CustomerName;
  private String CusomerACCTNumber; 
  // ==> setters and getters
}

public class BillTxDetails {
  private String BillID;
  private String BillDate;
  private String Time;
  // ==> setters and getters
} 

public static void main(String ...) {
  Class[] c = new Class[] { CustomerDetails.class,  BillTxDetails.class };
  JAXBContext jc =JAXBContext.newInstance(Data.class);
  jc.generateSchema(new SchemaOutputResolver() {

    @Override 
    public Result createOutput(String namespaceUri, String suggestedFileName) throws IOException {
      StreamResult result = new StreamResult(System.out);
      result.setSystemId(suggestedFileName); 
      return result 
    }
  }); 
}

Mais je ne suis toujours pas dans l'élément racine XSD Merci

Author: Community, 2015-07-14

4 answers

Si vous utilisez eclipse, vous pouvez faire ce qui suit.

  • créez un fichier XML dans n'importe quel projet.
  • clic droit sur le fichier XML cliquez sur Générer un schéma.
  • donnez-lui un nom

J'ai obtenu ce qui suit en essayant de générer un schéma à partir de votre XML

<?xml version="1.0" encoding="UTF-8"?><xsd:schema   xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="BillDetails">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element maxOccurs="unbounded" ref="BillTxDetails"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="Data">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="CustomerDetails"/>
        <xsd:element ref="BillDetails"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="CustomerDetails">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="CustomerName"/>
        <xsd:element ref="CusomerACCTNumber"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="Time" type="xsd:string"/>
  <xsd:element name="BillTxDetails">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="BillID"/>
        <xsd:element ref="BillDate"/>
        <xsd:element ref="Time"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="BillID" type="xsd:string"/>
  <xsd:element name="BillDate" type="xsd:string"/>
  <xsd:element name="CustomerName" type="xsd:string"/>
  <xsd:element name="CusomerACCTNumber" type="xsd:string"/>
  </xsd:schema>

Puis faites un clic droit sur xsd et sélectionnez générer des classes java

 1
Author: Manoj Agarwal, 2015-07-14 10:56:02

Votre point de départ devrait être le fichier XSD. Vous pouvez utiliser un générateur XSD en ligne pour en créer un à partir de votre XML: http://www.freeformatter.com/xsd-generator.html

Vous pouvez aussi utiliser un outil comme Trang http://www.thaiopensource.com/relaxng/trang.html

, Ou si vous voulez construire votre propre XSD générateur, regardez ce lien Générer XSD par programmation en java

Enfin, voici quelques exemples de JAXB qui peuvent vous aider ...

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.SchemaOutputResolver;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamResult;

import org.xml.sax.InputSource;

import com.sun.codemodel.JCodeModel;
import com.sun.tools.xjc.api.S2JJAXBModel;
import com.sun.tools.xjc.api.SchemaCompiler;
import com.sun.tools.xjc.api.XJC;

public class Demo {

  public static void buildClasses(File xsdFile) throws IOException {
    SchemaCompiler sc = XJC.createSchemaCompiler();
      sc.parseSchema(new InputSource(xsdFile.toURI().toString()));
      S2JJAXBModel model = sc.bind();

      JCodeModel cm = model.generateCode(null, null);
      cm.build(new File("."));
  }

  public static final void printFile(File file) throws IOException {
    BufferedReader reader = new BufferedReader(new FileReader(file));
    String line = null;
    while ((line = reader.readLine()) != null) {
      System.out.println(line);
    }   
    reader.close();
  }

  public static void main(String[] args)  {
    try {

      Example example;
      File xmlFile = new File("example.xml");
      File xsdFile = new File("example.xsd");
      JAXBContext jaxbContext = JAXBContext.newInstance(Example.class);

      ////////////////////////////////////////////////////////////////////////////////////
      // USE THIS CODE TO BUILD YOUR XML FROM AN EXISTING INSTANTIATED JAVA CLASS 
      ////////////////////////////////////////////////////////////////////////////////////    
      System.out.println("===========================================");  
      example = new Example();
      example.id = 123;
      example.name = "Constantin";
      example.dob = new SimpleDateFormat("yyyy-MM-dd").parse("1971-01-13");

      Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
      jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
      jaxbMarshaller.marshal(example, xmlFile);
      printFile(xmlFile);
      System.out.println("===========================================");  

      ////////////////////////////////////////////////////////////////////////////////////
      // USE THIS CODE TO BUILD YOUR XSD FROM AN EXISTING JAVA CLASS 
      ////////////////////////////////////////////////////////////////////////////////////  
      System.out.println("===========================================");  
      jaxbContext.generateSchema(new SchemaOutputResolver() {
        @Override
        public Result createOutput(String namespaceUri, String suggestedFileName) throws IOException {
          StreamResult result = new StreamResult(new FileOutputStream(xsdFile));
          result.setSystemId(xsdFile.getAbsolutePath());
          return result;
        }
      });
      printFile(xsdFile);
      System.out.println("===========================================");  

      ////////////////////////////////////////////////////////////////////////////////////
      // USE THIS CODE TO INSTANTIATE A JAVA CLASS FROM AN EXISTING XML FILE
      ////////////////////////////////////////////////////////////////////////////////////    
      System.out.println("===========================================");     
      Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
      example = (Example) jaxbUnmarshaller.unmarshal(xmlFile);
      System.out.println("[" + example.getId() + "][" + example.getName() + "][" + example.getDOB() + "]");
      System.out.println("===========================================");  


      ////////////////////////////////////////////////////////////////////////////////////
      // USE THIS CODE TO BUILD JAVA CLASSES FROM EXISTING XSD FILE 
      ////////////////////////////////////////////////////////////////////////////////////    
      buildClasses(xsdFile);      
    } 
    catch (JAXBException e) {
      e.printStackTrace();
    } 
    catch (IOException e) {
      e.printStackTrace();
    } 
    catch (ParseException e) {
      e.printStackTrace();
    }
  }
}

@XmlRootElement
class Example {
  int id;
  String name;
  Date dob;

  @XmlElement
  public void setId(int id) {
    this.id = id;
  }

  public int getId() {
    return id;
  }

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

  public String getName() {
    return name;
  }

  @XmlElement
  public void setDOB(Date dob) {
    this.dob = dob;
  } 

  public Date getDOB() {
    return dob;
  }
}

Vous devrez peut-être télécharger des fichiers jars de dépendance pour que cela fonctionne : https://jaxb.java.net/2.2.11/

 1
Author: Constantin, 2017-05-23 12:29:46

J'ai essayé de cette façon, la classe public CustomerDetails{private String Nomclient;private String CusomerACCTNumber;==>les setters et getters}public class BillTxDetails{private String BillID;private String BillDate;private String Temps;==>les setters et getters} public static void main (Sring ....){Class[] c = {CustomerDetails.classe, BillTxDétails.la classe};JAXBContext jc =JAXBContext.newInstance (Données.classe);jc.generateSchema(new SchemaOutputResolver () {@Override résultat public createOutput(Chaîne namespaceUri, String suggestedFileName) lance IOException {StreamResult result = new StreamResult(System.out);le résultat.setSystemId (suggestedFileName); renvoie le résultat }}); Mais je ne suis toujours pas dans l'élément racine XSD

 0
Author: Raj, 2015-07-14 10:58:11