现在的位置: 首页 > 综合 > 正文

jaxb 通过xml转ava对象

2013年04月16日 ⁄ 综合 ⁄ 共 2845字 ⁄ 字号 评论关闭

今天在开发rest接口,要使用jaxb从对象生成xml返回给客户端。由于是中途介入,jaxb已经被人成功地引入到了我们的web项目中,所以在只里之是想说下如何从xml生成jaxb需要的java对象。

1.第一步:通常我们会跟客户端程序定义好传输数据xml,如
<?xml version="1.0" encoding="UTF-8"?>
<users>
    <user>
        <name>小李</name>
        <sex>男</sex>
        <age>24</age>
    </user>

    <user>
        <name>小丽</name>
        <sex>女</sex>
        <age>18</age>
    </user>

    <user>
        <name>小王</name>
        <sex>男</sex>
        <age>22</age>
    </user>
</users>

2.第二步:可以通过一些外部工具生成xml的Schema文档
这里推荐两个网址供大家参考:
http://www.xmlforasp.net/CodeBank/System_Xml_Schema/BuildSchema/BuildXMLSchema.aspx
http://www.dotkam.com/2008/05/28/generate-xsd-from-xml/

<?xml version="1.0" encoding="utf-16"?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="users" type="usersType" />
  <xsd:complexType name="usersType">
    <xsd:sequence>
      <xsd:element maxOccurs="unbounded" name="user" type="userType" />
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="userType">
    <xsd:sequence>
      <xsd:element name="name" type="xsd:string" />
      <xsd:element name="sex" type="xsd:string" />
      <xsd:element name="age" type="xsd:int" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

 

3.第三步:利用JAXB工具包(http://www.oracle.com/technetwork/java/index-jsp-136025.html),让它来替我们生成操纵符合这个Schema规定的所有XML实例文档的所有Java源代码
如果已经设置好了环境变量的话,那么只需要运行JAXB包所带的“xjc”运行程序,例如

%JAXB_HOME%\bin\xjc.bat userSchema.xsd -d src -p primer.userinfo
其中:

A.        %JAXB_HOME%是你安装JAXB工具包的位置,通常在jwsdp工具包的子目录下。

B.        userSchema.xsd 是Schema的文件名,一般以xsd作为文件名的后缀。

C.        -d  的选项,是指定系统生成的Java源代码所放置的目录,示例中为:src

D.       -p  的选项,是指定系统生成的Java源代码所在的Java Package的名称,示例中为:primer.userinfo

E.        还有更多的选项,请参考JAXB的相关文档。

如果运行成功的话,就会在你"-d"选项指定的目录下产生一些java代码文件

注意:现在JDK1.6的bin目录下已经带有xjc.exe,直接使用就行了。我一开始还下了那个工具包,结果报"but found class javax.xml.bind.annotation.AccessType"的异常,定位了半天说是版本冲突。所以说1.6的jdk就直接运行就行了,1.5的话才下那个东东

 

4.第四步 在应用程序中使用这些代码
    下面我们分析一下如何在我们的应用程序中使用JAXB工具包替我们生成的代码。

1)        JAXBContext 提供了一个入口,通过这个入口可以管理必要的XML/Java绑定信息。客户端应用程序通过newInstance(contextPath)方法得到该类的新实例。contextPath 参数包含一个或多个Java包名,这些Java包就是了JAXB编译器所产生的接口代码所在的Java包。该参数值初始化JAXBContext 对象,使得它能够管理JAXB编译器产生的接口。
JAXBContext jc = JAXBContext.newInstance("primer.userinfo");

 
 

2)        而通过ObjectFactory,可以直接生成根节点java对象Users 和子对象User。
User userA = objFactory.createUser();
 
Users users = objFactory.createUsers();
 

3)        对于Marshaller和Unmarshaller,这两个对象主要是用于Java对象和XML文档互相转换的主要接口(Marshaller负责从Java对象到XML文档的转换,Unmarshaller负责从XML文档到Java对象的转换)。
JAXBElement usersE = objFactory.createUsers(users);

Marshaller marshaller = jc.createMarshaller();

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

marshaller.marshal( usersE,new FileOutputStream("src/test.xml"));
 
 Marshaller能把Users 对象转换成XML文件
JAXBElement usersE = (JAXBElement)jc.createUnmarshaller().unmarshal(new File("src/test.xml"));

Users users = (Users)usersE.getValue();
 
 Unmarshaller能把 XML文件转换成Users对象

抱歉!评论已关闭.