首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从.XSD文件生成Java类...?

从.XSD文件生成Java类...?
EN

Stack Overflow用户
提问于 2009-03-26 16:14:35
回答 13查看 328.8K关注 0票数 140

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

我希望能够轻松地从这些.XSD文件生成Java类,然后使用这些文件将XML编组为Java对象,并将Java对象编组为可扩展标记语言。

有没有简单的方法可以做到这一点……?

理想情况下,它在运行时不需要基本Java发行版之外的任何库。但我很灵活..。

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2009-03-26 16:18:18

JAXB做的正是您想要的。从1.6开始,它被内置于JRE/JDK中

票数 125
EN

Stack Overflow用户

发布于 2011-08-31 03:49:15

要扩展上面的“使用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类

票数 123
EN

Stack Overflow用户

发布于 2009-03-26 22:13:08

如果您希望在不到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

教程内容:

用于简单Java-XML 的JAXB

在Java中有许多方法可以进行XML序列化。如果希望对解析和序列化进行细粒度控制,可以使用SAX、DOM或Stax以获得更好的性能。然而,我经常想做的是POJO和XML之间的简单映射。但是,创建Java类来手动执行XML事件解析并不是一件容易的事情。我最近发现JAXB是一种快速方便的Java-XML映射或序列化。

JAXB包含很多有用的特性,您可以在这里查看参考实现。Kohsuke's Blog也是学习有关JAXB的更多信息的好资源。对于本文,我将向您展示如何使用JAXB进行简单的Java-XML序列化。

从XML到

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

从代码中

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

我的Item.java准备好了。然后,我可以继续创建用于封送处理项的JAXB脚本。

代码语言:javascript
复制
//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文件。它看起来是这样的:

代码语言:javascript
复制
<?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>

很简单,对吧?或者,您可以通过简单地更改编组(...)的参数,将输出XML作为文本字符串、流、编写器、ContentHandler等。方法,如

代码语言:javascript
复制
...
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

让我们颠倒这个过程。假设我现在有一段XML string数据,我想把它转换成Item.java对象。XML数据(代码清单3)如下所示

代码语言:javascript
复制
<?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对象

代码语言:javascript
复制
...
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源可以有多种形式,既来自流,也来自文件。唯一的区别是方法参数:

代码语言:javascript
复制
...
unmarshaller.unmarshal(new File("Item.xml")); // reading from file
...
// inputStream is an instance of java.io.InputStream, reading from stream
unmarshaller.unmarshal(inputStream);

使用XML Schema进行验证

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

代码语言:javascript
复制
...
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时,如果输入的XML不符合模式,将捕获异常。有关完整的代码清单,请参阅代码清单5 (invalid_item.xml)。

代码语言:javascript
复制
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‘属性改为字符串而不是整数。

如果XML输入对模式有效,那么XML数据将被成功地解组到Item.java对象。

票数 43
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/686453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档