从.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: –
- 将xsd复制到新的/现有的项目中。
- 确保你在classpath中有JAXB所需的JAR。 你可以在这里下载一个。
- 右键单击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