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

时间:2021-01-09 11:55: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 是否是格式良好的软件

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

     1.3  反转xsd 文件

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


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

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


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

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


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

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

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


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