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
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
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/
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