zoukankan      html  css  js  c++  java
  • java对象与XML相互转化

    起因

      最近在公司做了一次webservice相关的任务,其中我最敢兴趣的就是webservice接受到XML对应的流以后是如何方便的转化成java对象,而java对象又是如何生成对应的XML的.

    目的

      这篇文章的目的就是为了记录一下: 当我和别人确定了XML的格式以后怎么最方便的将它映射到java对象上,java对象又如何生成对应的XML报文.

    原理

      java有XML和JAVA对象相互转化的方法,那就是JAXB.除了jaxb之外开发过程中我还发现了一些小技巧,需要记录一下.

    具体

    webservice服务之间数据格式如果是XML的话,那么最关键最首先要做的应该是先定下双方的XML的格式.

    如果XML已经有了,比如这样:

     2 <person>
     3     <name>abc</name>
     4     <age>24</age>
     5     <computers>
     6         <computer>
     7             <name>p1</name>
     8             <cpu>i3</cpu>
     9         </computer>
    10         <computer>
    11             <name>p2</name>
    12             <cpu>i5</cpu>
    13         </computer>
    14         <computer>
    15             <name>p3</name>
    16             <cpu>i7</cpu>
    17         </computer>
    18     </computers>
    19 </person>

    那么我们应该生成他对应的XSD文件.

    XSD文件就是校验XML用的,JAXB也需要用他生成java对象.

    公司的做法是找个XSD模板,然后改改改.......简单粗暴.....这样的话模板需要和你的结构比较类似,不然改起来会很痛苦,自己写过XSD的朋友应该都深有体会....反正当初我找了个单层的XSD模板,我的报文是3层嵌套的...我改完有N个BUG....各种校验不通过....

    其实有很多工具可以生成XSD文件,比如我现在就用XMLSPY

    打开前面写的XML报文以后可以自动生成相对应的XSD.

    但是自动生成的XSD可能有些地方的校验不是我们想要的,在这个工具里也可以比较方便的去调整,比如

    比如computers下的computer这里自动生成的XSD要求是至少1个computer节点,最多无限个.如果我们的业务需求是最少可以没有,最多无限个的话我们可以修改它满足我们的条件(虽然似乎生成的java对象没有什么区别)

    然后XSD文档就有了..有了XSD文档以后只要生成利用JAVA自带的XJC生成相应的java对象即可.网上有很多相关命令.

    我是自己建一个.cmd文件,然后写入

    1 D:jetjdk1.7jdk-7windows-x64inxjc -d .   test.xsd

    即可.就是XJC的路径,生成java文件目标地址,xsd地址.

    然后运行就能生成java对象了.

    最后写个测试类来看看好不好用.

     1 package test.jaxb;
     2 
     3 import java.io.File;
     4 import java.io.IOException;
     5 import java.io.StringWriter;
     6 
     7 import javax.xml.bind.JAXBContext;
     8 import javax.xml.bind.JAXBException;
     9 import javax.xml.bind.Marshaller;
    10 import javax.xml.bind.Unmarshaller;
    11 
    12 public class JAXBConverterTest {
    13     public static void main(String[] args) throws IOException, JAXBException {
    14         JAXBContext context = JAXBContext.newInstance(Person.class);
    15         Unmarshaller unmarshaller = context.createUnmarshaller();
    16         Object obj = unmarshaller.unmarshal(new File("C:/Users/Administrator/Desktop/jaxb/test.xml"));
    17         System.out.println(obj);
    18 
    19         System.out.println("=======================");
    20 
    21         StringWriter sw = new StringWriter();
    22         Marshaller marshaller = context.createMarshaller();
    23         marshaller.marshal(obj, sw);
    24         System.out.println(sw.toString());
    25     }
    26 }
    Person [name=abc, age=24, computers=Computers [computer=[Computer [name=p1, cpu=i3], Computer [name=p2, cpu=i5], Computer [name=p3, cpu=i7]]]]
    =======================
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?><person><name>abc</name><age>24</age><computers><computer><name>p1</name><cpu>i3</cpu></computer><computer><name>p2</name><cpu>i5</cpu></computer><computer><name>p3</name><cpu>i7</cpu></computer></computers></person>

    看来效果不错.

    小结

    webservice开发流程小结:先定下XML报文 -> 利用工具生成XSD -> XJC生成java对象 -> 调用JAXB相关方法转化java对象和XML报文

  • 相关阅读:
    使用PHP模拟post提交数据
    window.event.keycode值大全
    php采集
    自己写的一个简单PHP采集器
    php如何实现定时任务,php定时任务方法,最佳解决方案,php自动任务处理
    关于delphi软件运行出现Invalid floating point operation的错误的解决办法
    delphi编程创建桌面快捷方式
    BCB直接访问硬件端口和物理内存
    delphi winio 输入
    总是说spring难学?来看完这些spring的注解及其解释,真香!
  • 原文地址:https://www.cnblogs.com/abcwt112/p/6133203.html
Copyright © 2011-2022 走看看