【问题标题】:How to create an XSD file using XML Data in java如何在 java 中使用 XML 数据创建 XSD 文件
【发布时间】:2015-10-02 22:20:00
【问题描述】:

我有一个类似的 XML 数据

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

如何使用java创建xsd文件?以及如何为上述xml数据创建java类(pojo/bean)? 我试过这种方式

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 根元素 谢谢

【问题讨论】:

  • 您有一个 XML 文件。这看起来不像是一个 XSD 文件...
  • 认为他的意思是他有一个 XML,他想从中构建一个 xsd。 OP请澄清你的问题
  • 这是要使用 java 生成 XSD 的 XMl 数据。
  • 通常,XSD 应该在 XML 之前创建,因为 XSD 文件的目的是验证您的 XML。考虑到这一点,您可以尝试使用 trang 之类的工具来创建 XSD 模板(从现有的 XML sn-p),然后手动修改您的 XSD,向其中添加任何额外的验证规则。没有工具能够准确地知道这些规则应该是什么,例如数据类型、最大长度、必需与可选等等
  • 谢谢,在我的关注中,首先我正在创建基于创建 XSD 文件的 java 类的示例 XML 数据和类(比如 JaxB 类)

标签: java xml parsing xsd


【解决方案1】:

您的起点应该是 XSD 文件。您可以使用在线 XSD 生成器从您的 XML 构建一个:http://www.freeformatter.com/xsd-generator.html

你也可以使用像 Trang 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;
  }
}

您可能需要下载一些依赖项 jar 来完成这项工作:https://jaxb.java.net/2.2.11/

【讨论】:

  • 感谢康斯坦丁,但在这里我需要为上述 XML 数据创建 java 类,即。 xml 数据的映射类。使用该 java 类需要生成 XSD 文件,例如 Class[] c = {CustomerDetails.class,FinancialAdvisorContactDetails.class,PolicyDetails.class,PremiumDetails.class,PremiumReceipt.class}; JAXBContext jc = JAXBContext.newInstance(c,null);
  • 我添加了上一篇文章的链接。在再次询问之前,您是否尝试过搜索现有答案?另外,将您的问题更改为读取“XML”而不是 XSD:我有一个 XML 文件数据,例如
  • 为每个标签创建了单独的 java 类...例如,为 CustomerDetails 创建了具有属性 CustomerName 和 CusomerACCTNumber 的 CustomerDetails 类。最后在执行 iam 之后没有在 xsd 中获得根标记,即 而是获得 。?如何使用java获取根元素
  • 尝试向我们展示您的代码,以便我们看到您做错了什么
【解决方案2】:

【讨论】:

  • 使用 trang 从 xml 构建您的 xsd (使用在线工具,或者,如果您必须以编程方式进行)不是更有意义吗?从那里,您可以使用 JAXB 构建您的类
【解决方案3】:

我试过这种方式 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(Sring ....){Class[] c = {CustomerDetails.class, BillTxDetails.class};JAXBContext jc =JAXBContext.newInstance(Data.class);jc.generateSchema(new SchemaOutputResolver() {@Override public Result createOutput(String namespaceUri, StringSuggestedFileName) throws IOException {StreamResult result = new StreamResult(System.out);result.setSystemId(suggestedFileName); 返回结果 }}); 但我仍然没有进入 XSD 根元素

【讨论】:

  • 将此添加到您的问题中并尝试对其进行格式化:)
【解决方案4】:

如果您使用的是 eclipse,您可以执行以下操作。

  • 在任何项目中创建一个 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 类

【讨论】:

    猜你喜欢
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多