从.XSD文件生成Java类…?

我有一个巨大的QuickBooks SDK .XSD模式文件,它定义了我可以从QuickBooks发送/接收的XML请求/响应。

我希望能够从这些.XSD文件中轻松生成Java类,然后我可以使用这些文件将XML编组为Java对象,将Java对象编码为XML。

有一个简单的方法来做到这一点…?

理想情况下,运行时不需要任何基础Java发行版以外的库。 但我很灵活

JAXB确实做你想要的。 它是从1.6开始构build到JRE / JDK中的

为了扩展上面的“使用JAXB”注释,

在Windows "%java_home%\bin\xjc" -p [your namespace] [xsd_file].xsd

例如"%java_home%\bin\xjc" -p com.mycompany.quickbooks.obj quickbooks.xsd

等一下,如果你有一个格式正确的XSD文件,你将会得到一些格式良好的Java类

如果您想在5分钟内开始编写Java到XML和XML到Java,请尝试简单XML序列化。 不要花几个小时学习JAXB API http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php

不过,如果你真的热衷于学习JAXB,这里有一个很好的教程http://blogs.oracle.com/teera/entry/jaxb_for_simple_java_xml

教程的内容:

JAXB用于简单的Java-XML序列化

在Java中有很多方法可以做XML序列化。 如果您想对parsing和序列化进行细粒度的控制,则可以使用SAX,DOM或Stax来获得更好的性能。 然而,我经常想要做的是POJO和XML之间的简单映射。 但是,创buildJava类来手动执行XML事件parsing不是微不足道的。 我最近发现JAXB是一个快捷方便的Java-XML映射或序列化。

JAXB包含很多有用的function,您可以在这里查看参考实现。 Kohsuke的博客也是学习更多关于JAXB的好资源。 对于这个博客条目,我将向您展示如何使用JAXB进行简单的Java-XML序列化。

POJO到XML

比方说,我有一个项目的Java对象。 我想将一个Item对象序列化为XML格式。 我首先要做的就是用javax.xml.bind.annotation。*包中的一些XML注释来注释这个POJO。 请参阅Item.java的代码清单1

从代码

  • @XmlRootElement(name="Item")表示我想成为根元素。
  • @XmlType(propOrder = {"name", "price"})表示我希望元素在XML输出中排列的顺序。
  • @XmlAttribute(name="id", ...)表示id是根元素的一个属性。
  • @XmlElement(....)表示我想价格和名称是项目内的元素。

我的Item.java已经准备好了。 然后,我可以继续创build编组项目的JAXB脚本。

 //creating Item data object Item item = new Item(); item.setId(2); item.setName("Foo"); item.setPrice(200); ..... JAXBContext context = JAXBContext.newInstance(item.getClass()); Marshaller marshaller = context.createMarshaller(); //I want to save the output file to item.xml marshaller.marshal(item, new FileWriter("item.xml")); 

有关完整的代码清单,请参阅代码清单2 main.java 。 输出代码清单3的item.xml文件被创build。 它看起来像这样:

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ns1:item ns1:id="2" xmlns:ns1="http://blogs.sun.com/teera/ns/item"> <ns1:itemName>Foo</ns1:itemName> <ns1:price>200</ns1:price> </ns1:item> 

容易吗? 您可以通过简单地更改marshal(…)方法的参数来将输出XML作为文本String,Stream,Writer,ContentHandler等进行传送

 ... JAXBContext context = JAXBContext.newInstance(item.getClass()); Marshaller marshaller = context.createMarshaller(); // save xml output to the OutputStream instance marshaller.marshal(item, <java.io.OutputStream instance>); ... JAXBContext context = JAXBContext.newInstance(item.getClass()); Marshaller marshaller = context.createMarshaller(); StringWriter sw = new StringWriter(); //save to StringWriter, you can then call sw.toString() to get java.lang.String marshaller.marshal(item, sw); 

XML到POJO

让我们改变过程。 假设我现在有一段XMLstring数据,我想把它变成Item.java对象。 XML数据(代码清单3)看起来像

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ns1:item ns1:id="2" xmlns:ns1="http://blogs.sun.com/teera/ns/item"> <ns1:itemName>Bar</ns1:itemName> <ns1:price>80</ns1:price> </ns1:item> 

然后,我可以解组这个xml代码到Item对象

 ... ByteArrayInputStream xmlContentBytes = new ByteArrayInputStream (xmlContent.getBytes()); JAXBContext context = JAXBContext.newInstance(Item.getClass()); Unmarshaller unmarshaller = context.createUnmarshaller(); //note: setting schema to null will turn validator off unmarshaller.setSchema(null); Object xmlObject = Item.getClass().cast(unmarshaller.unmarshal(xmlContentBytes)); return xmlObject; ... 

有关完整的代码清单,请参阅代码清单2(main.java)。 XML源可以来自Stream和文件的多种forms。 唯一的区别就是方法参数:

 ... unmarshaller.unmarshal(new File("Item.xml")); // reading from file ... // inputStream is an instance of java.io.InputStream, reading from stream unmarshaller.unmarshal(inputStream); 

使用XML模式validation

我想提到的最后一件事是在解组到Java对象之前使用模式validationinputXML。 我创build了一个名为item.xsd的XML模式文件。 有关完整的代码清单,请参阅代码清单4(Item.xsd)。 现在我要做的就是注册这个模式进行validation。

 ... Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI) .newSchema(new File("Item.xsd")); unmarshaller.setSchema(schema); //register item.xsd shcema for validation ... 

当我尝试将XML数据解组为POJO时,如果input的XML不符合该模式,则将捕获exception。 有关完整的代码清单,请参阅代码清单5(invalid_item.xml)。

 javax.xml.bind.UnmarshalException - with linked exception: javax.xml.bind.JAXBException caught: null [org.xml.sax.SAXParseException: cvc-datatype-valid.1.2.1: 'item1' is not a valid value for 'integer'.] 

在这里,我将“id”属性更改为string而不是整数。

如果XMLinput对模式有效,则XML数据将成功解组到Item.java对象。

使用Eclipse IDE: –

  1. 将xsd复制到新的/现有的项目中。
  2. 确保你在classpath中有JAXB所需的JAR。 你可以在这里下载一个。
  3. 右键单击XSD文件 – >生成 – > JAXB类。

XMLBeans将做到这一点。 特别是“scomp”命令。

编辑:XMLBeans已经退休了 ,检查这个stackoverflowpost了解更多信息。

Maven可以用于这个目的,你需要添加一些依赖关系,只需清理你的应用程序。 您将获得在目标文件夹中自动创build的所有类。

只需将它们从目标复制到所需的位置,这里是我用来从xsd文件创build分类的pom.xml:

  <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxb2-maven-plugin</artifactId> <executions> <execution> <goals> <goal>xjc</goal> </goals> </execution> </executions> <configuration> <schemaDirectory>src/main/webapp/schemas/</schemaDirectory> </configuration> </plugin> </plugins> </pluginManagement> </build> </project> 

把你的xsd文件放在“src / main / webapp / schemas /”下,maven会在编译时find它们。

希望这会帮助你,更多的信息可以在http://www.beingjavaguys.com/2013/04/create-spring-web-services-using-maven.htmlfind。;

希望它会帮助:)

最简单的方法是使用命令行。 只需input您的.xsd文件的目录:

 xjc myFile.xsd. 

所以,java将生成所有的Pojos。

如果你不介意使用外部库,我已经使用Castor在过去做这个。

那么最好的select是%java_home%\bin\xjc -p [your namespace] [xsd_file].xsd

我也有一个问题,如果我们有一个select在这里做逆向工程。 如果是的话,我们可以从pojo类生成xsd?

JAXB限制。

我在JAXB上工作,根据我的意见,它是处理XML和Java对象之间数据的一个好方法。 积极的一面是它的成熟和更好的性能和在运行时的数据控制。 如果使用了很好的构build工具或脚本,它将会消除很多编码工作。

我发现configuration部分不是一个直接的任务,花了几个小时来获得开发环境的设置。

但是由于我面临的一个愚蠢的限制,我放弃了这个解决scheme。 我的XML模式定义(XSD)有一个名为“值”的属性/元素,我必须使用XSD。 这个很小的约束迫使我的绑定步骤XJC失败,并且已经使用了一个错误“属性值”。

这是由于JAXB的实现,绑定过程试图通过向每个类添加一些属性来创buildXSD中的Java对象,其中一个属性是一个值属性。 当它处理我的XSD时,它抱怨已经有一个名称属性。

JAXB的XJC不是可能的答案吗? 我试图达到同样的目的。 尽pipe如此,仍处于“尝试”阶段。 来到了XJC,所以想到分享。

着名的JAXB

有一个maven插件 ,可以在你想要的任何构build阶段为你做这个。

你可以用两种方式来做这件事情:xsd < – > Java

在谈到JAXB限制时,为不同属性使用相同名称的解决scheme是将内联jaxb定制添加到xsd:

+

。 。 绑定声明。 。

或外部自定义…

你可以看到更多的信息: http : //jaxb.java.net/tutorial/section_5_3-Overriding-Names.html