Java中使用xmlbeans解析xml开发总结
2018-04-27 15:44
816 查看
最近在工作中用到了webservice,需要解析webservice接口返回的各种xml格式报文。xml的解析一向是很伤脑筋的,而Java语言里解析xml的传统方式:dom解析和sax解析,对我而言实在是太过于死板僵硬望之却步,多方研究后在本项目中采用了apache提供的xml解析解决方案:xmlbeans,特在此总结xmlbeans的使用方法。
一、关于xmlbeans
xmlbeans通过利用XML Schema的功能来提供结构化和约束性数据类型,开发者可以像Java对象那样直接访问XML文档。通过使用XMLBeans,Java开发者不需要花时间来编写导入/导出和有效性检验代码。
二、下载配置xmlbeans
这里我选择的是xmlbeans-2.4.0
a. 下载xmlbeans,从apache xmlbeans官网 http://xmlbeans.apache.org/ 或者 csdn链接:下载xmlbeans-2.4.0。假定下载到C:\xmlbeans-2.4.0
b. 设置环境变量XMLBEANS_HOME= C:\xmlbeans-2.4.0
c. 在path中加入%XMLBEANS_HOME%\bin
三、生成XML Schema文件
什么是XML Schema文件? 正常情况下,每个XML文件都有一个Schema文件,XML Schema文件是一个XML的约束文件,它定义了 XML文件的结构和元素.以及对元素和结构的约束. 通俗地讲,如果说XML文件是数据库里的记录,那么Schema就是表结构定义.
为什么需要这个文件? xmlbeans需要通过这个文件知道一个XML文件的结构以及约束,比如数据类型等. 利用这个Schema文 件,xmlbeans将会产生一系列相关的Java Classes来实现对XML的操作。
虽然有工具可以通过xml直接生成XML Schema文件,但是这种直接生成的通常不能直接使用,需要修改后才能使用。推荐在理解xml结构的基础上用Eclipse图形化界面操作直接生成XML Schema文件,方便快捷。
以登录接口返回xml为例:
根据上述xml,写出如下XML Schema文件:
LoginResponse是根节点,其中最关键的SHINEConfig的配置如下:
这里定义的数据约束如下:RESULTConfig的约束是[1..1],QUEUETYPELISTConfig的约束是[0..1],QUEUE_TYPEConfig的约束是[1...*]。这里是由于在这个xml结构里RESULT元素只会出现一次,QUEUETYPELIST元素在有QUENE_TYPE数据时才会出现否则不出现,QUENE_TYPE元素至少出现一次。
CallLogin.xsd文件内容如下:
四、利用scomp命令来编译XML Schema文件生成jar
scomp是xmlbeans提供的一个编译工具,它在bin的目录下. 通过这个工具,
我们可以将以上的Schema文件生成Java Classes.
scomp的语法如下:-
scomp [options] [dirs]* [schemaFile.xsd]* [service.wsdl]* [config.xsdconfig]*
主要参数说明:
-src [dir] -- 生成的Java Classes存放目录
-srconly -- 不编译Java Classes,不产生Jar文件
-out [jarFileName] -- 生成的Jar文件,缺省是xmltypes.jar
-compiler -- Java编译器的路径,即Javac的位置
schemaFile.xsd -- XML Schema文件位置
config.xsdconfig -- xsdconfig文件的位置, 这个文件主要用来制定生成的Java Class 的一些文件名规则和Package的名称
命令行中运行:
这个命令行的意思是告诉scomp在C:\xsd目录生成CallSystem.jar, 要解析的Schema文件是C:\xsd目录下的所有xsd。
注:这是一个很实用的批量打包的命令,可以将多个xsd文件生成的java class打包进一个jar里。单独编译某个xsd的话直接在scope命令里指定xsd文件名即可。
执行结果如下:
scomp命令还可以跟上xsdconfig文件,用于配置生成的class的package。(本例中在xsd中文件中已根据包路径配置了命名空间http://webservice.test.com/CallLogin,那么生成的jar里的包路径就是com.test.webservice.callLogin,所以此处忽略了xsdconfig配置。)
config.xsdconfig内容如下:
将xmlbeans/lib下的包和生成的CallSystem.jar包加入到Project的ClassPath中
pom.xml配置如下:
五、Java程序中读取/构造xml
注:其中有xml=xml.replace("http://tempuri.org/", "http://webservice.test.com/CallLogin")这么一段代码,这是由于多个webservice接口返回的xml命名空间都是 http://tempuri.org/ ,但是编写xsd时必须为各个xsd指定不同的命名空间防止生成jar包里存在冲突。所以在拿到webservice接口返回的xml时,必须把原始的命名空间http://tempuri.org/转换成xsd中实际的命名空间http://webservice.test.com/CallLogin才能被正常解析。
执行结果如下:
可以看到引入xmlbeans根据xsd文件生成的jar包后,就能轻轻松松的以访问对象的方式去访问xml了。这里我只写了读xml的操作,写xml操作其实也是一样的简单,后续有时间我会继续更新。
五、结束语
xmlbeans能帮助我们轻易读写XML,这将有助于我们降低XML的学习和使用,有了这个基础,开发人员将为学习更多地XML相关技术和Web Services,JMS等其他J2EE技术打下良好地基础。
欢迎共同探讨。
一、关于xmlbeans
xmlbeans通过利用XML Schema的功能来提供结构化和约束性数据类型,开发者可以像Java对象那样直接访问XML文档。通过使用XMLBeans,Java开发者不需要花时间来编写导入/导出和有效性检验代码。
二、下载配置xmlbeans
这里我选择的是xmlbeans-2.4.0
a. 下载xmlbeans,从apache xmlbeans官网 http://xmlbeans.apache.org/ 或者 csdn链接:下载xmlbeans-2.4.0。假定下载到C:\xmlbeans-2.4.0
b. 设置环境变量XMLBEANS_HOME= C:\xmlbeans-2.4.0
c. 在path中加入%XMLBEANS_HOME%\bin
三、生成XML Schema文件
什么是XML Schema文件? 正常情况下,每个XML文件都有一个Schema文件,XML Schema文件是一个XML的约束文件,它定义了 XML文件的结构和元素.以及对元素和结构的约束. 通俗地讲,如果说XML文件是数据库里的记录,那么Schema就是表结构定义.
为什么需要这个文件? xmlbeans需要通过这个文件知道一个XML文件的结构以及约束,比如数据类型等. 利用这个Schema文 件,xmlbeans将会产生一系列相关的Java Classes来实现对XML的操作。
虽然有工具可以通过xml直接生成XML Schema文件,但是这种直接生成的通常不能直接使用,需要修改后才能使用。推荐在理解xml结构的基础上用Eclipse图形化界面操作直接生成XML Schema文件,方便快捷。
以登录接口返回xml为例:
<?xml version="1.0" encoding="utf-8"?> <LoginResponse xmlns="http://tempuri.org/"> <LoginResult> <SHINE> <RESULT> <RESULTCODE>0</RESULTCODE> <RESULTMSG>操作成功</RESULTMSG> </RESULT> <QUEUETYPELIST> <QUEUE_TYPE> <SOURCE_ID>001001</SOURCE_ID> <DISPLAY_NAME>第五房间</DISPLAY_NAME> <NAME>第五房间</NAME> <QUEUE_TYPE_ID>7</QUEUE_TYPE_ID> </QUEUE_TYPE> </QUEUETYPELIST> </SHINE> </LoginResult> </LoginResponse>
根据上述xml,写出如下XML Schema文件:
LoginResponse是根节点,其中最关键的SHINEConfig的配置如下:
这里定义的数据约束如下:RESULTConfig的约束是[1..1],QUEUETYPELISTConfig的约束是[0..1],QUEUE_TYPEConfig的约束是[1...*]。这里是由于在这个xml结构里RESULT元素只会出现一次,QUEUETYPELIST元素在有QUENE_TYPE数据时才会出现否则不出现,QUENE_TYPE元素至少出现一次。
CallLogin.xsd文件内容如下:
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://webservice.test.com/CallLogin" xmlns:tns="http://webservice.test.com/CallLogin" elementFormDefault="qualified"> <complexType name="SHINEConfig"> <sequence> <element name="RESULT" type="tns:RESULTConfig" maxOccurs="1" minOccurs="1"> </element> <element name="QUEUETYPELIST" type="tns:QUEUETYPELISTConfig" maxOccurs="1" minOccurs="0"> </element> </sequence> </complexType> <complexType name="RESULTConfig"> <sequence> <element name="RESULTCODE" type="string"></element> <element name="RESULTMSG" type="string"></element> </sequence> </complexType> <element name="LoginResponse" type="tns:LoginResponseConfig"></element> <complexType name="LoginResultConfig"> <sequence> <element name="SHINE" type="tns:SHINEConfig"></element> </sequence> </complexType> <complexType name="QUEUETYPELISTConfig"> <sequence> <element name="QUEUE_TYPE" type="tns:QUEUE_TYPEConfig" maxOccurs="unbounded" minOccurs="1"></element> </sequence> </complexType> <complexType name="QUEUE_TYPEConfig"> <sequence> <element name="SOURCE_ID" type="string"></element> <element name="DISPLAY_NAME" type="string"></element> <element name="NAME" type="string"></element> <element name="QUEUE_TYPE_ID" type="string"></element> </sequence> </complexType> <complexType name="LoginResponseConfig"> <sequence> <element name="LoginResult" type="tns:LoginResultConfig"></element> </sequence> </complexType> </schema>
四、利用scomp命令来编译XML Schema文件生成jar
scomp是xmlbeans提供的一个编译工具,它在bin的目录下. 通过这个工具,
我们可以将以上的Schema文件生成Java Classes.
scomp的语法如下:-
scomp [options] [dirs]* [schemaFile.xsd]* [service.wsdl]* [config.xsdconfig]*
主要参数说明:
-src [dir] -- 生成的Java Classes存放目录
-srconly -- 不编译Java Classes,不产生Jar文件
-out [jarFileName] -- 生成的Jar文件,缺省是xmltypes.jar
-compiler -- Java编译器的路径,即Javac的位置
schemaFile.xsd -- XML Schema文件位置
config.xsdconfig -- xsdconfig文件的位置, 这个文件主要用来制定生成的Java Class 的一些文件名规则和Package的名称
命令行中运行:
scomp -out c:\xsd\CallSystem.jar c:\xsd\*.xsd -compiler "C:\Program Files\Java\jdk1.7.0_80\bin\javac"
这个命令行的意思是告诉scomp在C:\xsd目录生成CallSystem.jar, 要解析的Schema文件是C:\xsd目录下的所有xsd。
注:这是一个很实用的批量打包的命令,可以将多个xsd文件生成的java class打包进一个jar里。单独编译某个xsd的话直接在scope命令里指定xsd文件名即可。
执行结果如下:
scomp命令还可以跟上xsdconfig文件,用于配置生成的class的package。(本例中在xsd中文件中已根据包路径配置了命名空间http://webservice.test.com/CallLogin,那么生成的jar里的包路径就是com.test.webservice.callLogin,所以此处忽略了xsdconfig配置。)
config.xsdconfig内容如下:
<xb:config xmlns:xb="http://xml.apache.org/xmlbeans/2004/02/xbean/config"> <xb:namespace> <xb:package>com.test</xb:package> </xb:namespace> </xb:config>
将xmlbeans/lib下的包和生成的CallSystem.jar包加入到Project的ClassPath中
pom.xml配置如下:
<dependency> <groupId>org.apache.xmlbeans</groupId> <artifactId>xmlbeans</artifactId> <version>2.4.0</version> </dependency>
五、Java程序中读取/构造xml
package com.test.webservice.test; import com.test.webservice.callLogin.LoginResponseConfig; import com.test.webservice.callLogin.LoginResponseDocument; import com.test.webservice.callLogin.LoginResultConfig; import com.test.webservice.callLogin.QUEUETYPEConfig; import com.test.webservice.callLogin.QUEUETYPELISTConfig; import com.test.webservice.callLogin.RESULTConfig; import com.test.webservice.callLogin.SHINEConfig; public class TestCallLogin { public static void main(String[] args) { String xml="<LoginResponse xmlns=\"http://tempuri.org/\">" +" <LoginResult>" +" <SHINE>" +" <RESULT>" +" <RESULTCODE>0</RESULTCODE>" +" <RESULTMSG>操作成功</RESULTMSG>" +" </RESULT>" +" <QUEUETYPELIST>" +" <QUEUE_TYPE>" +" <SOURCE_ID>001001</SOURCE_ID>" +" <DISPLAY_NAME> 第五房间</DISPLAY_NAME>" +" <NAME> 第五房间</NAME>" +" <QUEUE_TYPE_ID>7</QUEUE_TYPE_ID>" +" </QUEUE_TYPE>" +" <QUEUE_TYPE>" +" <SOURCE_ID>001002</SOURCE_ID>" +" <DISPLAY_NAME> 第六房间</DISPLAY_NAME>" +" <NAME> 第六房间</NAME>" +" <QUEUE_TYPE_ID>8</QUEUE_TYPE_ID>" +" </QUEUE_TYPE>" +" </QUEUETYPELIST>" +"</SHINE></LoginResult></LoginResponse>"; LoginResponseDocument loginResponseDocument = null; try { xml=xml.replace("http://tempuri.org/", "http://webservice.test.com/CallLogin"); loginResponseDocument=LoginResponseDocument.Factory.parse(xml); LoginResponseConfig loginResponseConfig=loginResponseDocument.getLoginResponse(); LoginResultConfig callNextResultConfig=loginResponseConfig.getLoginResult(); SHINEConfig shineConfig=callNextResultConfig.getSHINE(); RESULTConfig resultConfig=shineConfig.getRESULT(); System.out.println("RESULTCODE():"+resultConfig.getRESULTCODE()); System.out.println("RESULTMSG():"+resultConfig.getRESULTMSG()); QUEUETYPELISTConfig queuetypelistConfig=shineConfig.getQUEUETYPELIST(); if(queuetypelistConfig!=null){ QUEUETYPEConfig[] queuetypeConfigs= queuetypelistConfig.getQUEUETYPEArray(); for (QUEUETYPEConfig queuetypeConfig : queuetypeConfigs) { System.out.print(queuetypeConfig.getSOURCEID()+"\t"+queuetypeConfig.getDISPLAYNAME()+"\t" +queuetypeConfig.getNAME()+"\t"+queuetypeConfig.getQUEUETYPEID()+"\r\n"); } } }catch (Exception e) { // TODO 自动生成 catch 块 e.printStackTrace(); } } }
注:其中有xml=xml.replace("http://tempuri.org/", "http://webservice.test.com/CallLogin")这么一段代码,这是由于多个webservice接口返回的xml命名空间都是 http://tempuri.org/ ,但是编写xsd时必须为各个xsd指定不同的命名空间防止生成jar包里存在冲突。所以在拿到webservice接口返回的xml时,必须把原始的命名空间http://tempuri.org/转换成xsd中实际的命名空间http://webservice.test.com/CallLogin才能被正常解析。
执行结果如下:
RESULTCODE():0 RESULTMSG():操作成功 001001 第五房间 第五房间 7 001002 第六房间 第六房间 8
可以看到引入xmlbeans根据xsd文件生成的jar包后,就能轻轻松松的以访问对象的方式去访问xml了。这里我只写了读xml的操作,写xml操作其实也是一样的简单,后续有时间我会继续更新。
五、结束语
xmlbeans能帮助我们轻易读写XML,这将有助于我们降低XML的学习和使用,有了这个基础,开发人员将为学习更多地XML相关技术和Web Services,JMS等其他J2EE技术打下良好地基础。
欢迎共同探讨。
相关文章推荐
- 如何使用XMLBeans兼容Java与XML应用开发
- 百度天气api开发 全解析xml和json格式 使用json-lib jsonObject、 Gson 方式把json 转换成 java对象
- 在JSP开发中使用jdom解析临时存放数据的XML文件
- Java XML解析 - 使用SAX 示例
- 使用xmlbeans解析xml
- 使用JSP + JAVABEAN + XML 开发的一个例子
- JAVA 开发工具Jcreator使用技巧总结 (转)
- java解析xml之三:使用domj4
- java解析xml之三:使用domj4
- 使用JSP + JAVABEAN + XML 开发的一个例子
- Java开发工具 JCreator的使用技巧总结
- 使用JSP + JAVABEAN + XML 开发的一个例子
- Spring 总结XML配置的十二个最佳实践-Java基础-Java-编程开发
- 使用JSP + JAVABEAN + XML 开发的一个例子
- 使用JSP + JAVABEAN + XML 开发的一个例子
- rss技术,使用java解析xml
- 初学者入门 JAVA 的 XML 编程实例解析-Java基础-Java-编程开发
- [Java学习]使用digester 解析xml配置文件
- Java中使用DOM来解析xml文档
- 【转载】JAVA 开发工具Jcreator使用技巧总结