webservice 中根据xml 片段,反转xsd 文件,生成java 对象

来源:互联网 发布:java棕色rgb 编辑:程序博客网 时间:2024/06/04 16:36

       在webservice 中,响应值有xml, json 等 形式, 当返回值 为xml 片段,但是又没有对方的xsd 文件和sdk 时,这是就需要我们程序员来手动解析返回的xml 片段了, 如果是几十行的xml 片段,我们使用dom4j 或sax 等xml 解析框架就行了,如果面对 几万行的返回值,那么手动解析 就必然是一件费时费力的工作 ,而且出错率还比较高。那么,自动将xml 解析成java对象的操作,将是我们程序员所希望看到的。


1.  xml 反转出 xsd 文件:

       1.1 下载xmlspy 软件, 用xmlspy 软件打开 xml 文件

     1.2  检查xml 是否是格式良好的软件


     1.3  反转xsd 文件




1.3  . 打开xsd 文件,可能需要 进行简单的修改 ,将xs:byte 类型修改为 xs:int 类型 或者 xs:string 类型


2. xsd -> java : 根据xsd 转换成java 对象, jdk1.7 自带 xjc 命令,可以根据xjc 命令直接转换成 java 对象

   命令格式:  xjc -d dir -p packgeName -verbose xxx.xsd



3. 解析 xml ->java 对象 : jdk 自带解析工具类:

import java.io.StringReader;import java.io.StringWriter;import javax.xml.bind.JAXBContext;import javax.xml.bind.Marshaller;import javax.xml.bind.Unmarshaller; public class JaxbBinder {      public static String convertToXml(Object obj) {         return convertToXml(obj, "UTF-8");     }      /**     * JavaBean转换为xml     * @param obj     * @param encoding      * @return      */     public static String convertToXml(Object obj, String encoding) {         String result = null;         try {             JAXBContext context = JAXBContext.newInstance(obj.getClass());             Marshaller marshaller = context.createMarshaller();             marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);             marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);              StringWriter writer = new StringWriter();             marshaller.marshal(obj, writer);             result = writer.toString();         } catch (Exception e) {             e.printStackTrace();         }          return result;     }      @SuppressWarnings("unchecked")     public static <T> T converyToJavaBean(String xml, Class<T> c) {         T t = null;         try {             JAXBContext context = JAXBContext.newInstance(c);             Unmarshaller unmarshaller = context.createUnmarshaller();             t = (T) unmarshaller.unmarshal(new StringReader(xml));         } catch (Exception e) {             e.printStackTrace();         }          return t;     }  }  


注意:在xml 转换成xsd 的过程中,可能会有一些命名空间的问题, 这就需要手动修改 xsd 文件, 可以删除命名空间,  然后再反转, 这样的话 ,当你进行webservice 请求时,获取到的返回字符串时,也得将返回字符串中的命名空间  replace 掉,这样才能正常将xml 片段转换成 java 对象





0 0