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