xsd java_从.XSD文件生成Java类......?

问题

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

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

是否有捷径可寻...?

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

#1 热门回答(117 赞)

JAXB完全符合你的要求。它从1.6开始内置于JRE / JDK中

#2 热门回答(109 赞)

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

#3 热门回答(35 赞)

如果要在不到5分钟的时间内开始将Java编码为XML,将XML编写为Java,请尝试使用Simple XML Serialization。不要花费数小时学习JAXB APIhttp://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php

教程内容:

JAXB for simple Java-XML serialization

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

JAXB包含很多有用的功能,你可以查看这里的参考实现.Kohsuke's Blog也是了解JAXB的更多资源。对于这篇博客文章,我将向你展示如何使用JAXB进行简单的Java-XML序列化。

POJO to XML

假设我有一个Item 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(....)表示我希望price和name成为Item中的元素。

MyItem.java准备好了。然后我可以继续为编组Item创建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"));

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

Foo

200

容易吗?你也可以通过简单地更改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, );

...

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字符串数据,我想把它变成Item.java对象。 XML数据(代码清单3)看起来像

Bar

80

然后我可以将这个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和file。唯一的区别是方法参数:

...

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)。现在我要做的就是注册这个模式进行验证。

...

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

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对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值