2015-07-14 3 views
-3

У меня есть XML-данные, такие какКак создать файл XSD с помощью XML-данных в Java

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

как создать XSD файл с помощью Java? и как создать класс java (pojo/bean) для данных выше xml? Я попробовал этот способ

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 
    } 
    }); 
} 

Но до сих пор РМКО не попадая в корневой элемент XSD Благодаря

+0

У вас есть файл XML. Это не похоже на файл XSD ans ... – Sirko

+0

Думаю, он имел в виду, что у него есть XML, из которого он хочет построить xsd. OP, пожалуйста, уточните свой вопрос. – Constantin

+0

Это данные XMl для генерации XSD с использованием java. – Raj

ответ

1

Ваша точка должна быть файл XSD. Вы можете использовать онлайн генератор XSD, чтобы построить одну из вашего XML: http://www.freeformatter.com/xsd-generator.html

Вы можете также использовать инструмент, как Транг http://www.thaiopensource.com/relaxng/trang.html

Или, если вы хотите создать свой собственный генератор XSD, посмотрите на эту ссылку Generate XSD programmatically in java

Наконец, вот некоторые примеры JAXB, которые могут помочь ...

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; 
    } 
} 

Вам может понадобиться загрузить некоторые банки зависимостей, чтобы сделать эту работу: https://jaxb.java.net/2.2.11/

+0

спасибо constantin, но здесь мне нужно создать java-класс для данных выше XML, т.е. класс сопоставления для данных xml. С помощью этого класса Java необходимо создать файл XSD, например Class [] c = {CustomerDetails.class, FinancialAdvisorContactDetails.class, PolicyDetails.class, PremiumDetails.class, PremiumReceipt.class}; JAXBContext jc = JAXBContext.newInstance (c, null); – Raj

+0

Я добавил ссылку на предыдущую запись. Вы пытались найти существующий ответ, прежде чем снова спрашивать его? Кроме того, измените свой вопрос, чтобы читать «XML» вместо XSD: у меня есть данные файла * XML *, такие как – Constantin

+0

Созданный отдельный класс java для каждого тега ... например, для CustomerDetails создан класс CustomerDetails, имеющий свойства CustomerName и CusomerACCTNumber. наконец, после выполнения iam, не получающего корневой тег в xsd, который является вместо получения .? как получить корневой элемент с помощью java – Raj

1

если вы используете eclipse u можете сделать следующий.

  • создать XML-файл в любом проекте.
  • щелкните правой кнопкой мыши по XML-файлу, чтобы сгенерировать схему.
  • дать ему имя

я получил следующее при попытке сгенерировать схему из вашего 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> 

затем правой кнопкой мыши на XSD и выберите генерировать классы Java

+0

Спасибо за помощь :) – Raj

0

Я попробовал этот путь public class CustomerDetails {private String CustomerName; private String CusomerACCTNumber; ==> сеттеры и получатели} public class BillTxDetails {private String BillID; private String BillDate; private String Time; == seters и getters} public static void main (Sring ....) {Class [] c = {CustomerDetails.class, BillTxDetails.class}; JAXBContext jc = JAXBContext.newInstance (Data.class); jc.generateSchema (новый SchemaOutputResolver() {@ Override public Результат createOutput (String namespaceUri, String suggestFileName) throws IOException {Результат StreamResult = новый StreamResult (System.out); result.setSystemId (предложеноFileName); результат возврата }}); Но до сих пор не IAM получать в XSD корневого элемента

+0

Добавьте это к вашему вопросу и попробуйте его форматировать :) – Constantin

0
+0

не имеет смысла построить xsd из xml (с помощью онлайн-инструмента или, если вы должны делать это программно), используя trang? Оттуда вы можете создавать свои классы с помощью JAXB – Constantin

Смежные вопросы