最近的项目中有个生成xml字符串的需求:
第三方合作伙伴提交一个请求,我们作为server端负责从DB中查询出符合条件的记录,然后构造成xml字符串返回给第三方合作伙伴。
以前有过dom的使用经验,但dom的缺点大家都知道:当xml比较复杂时,性能不是很好。当DB中记录比较多时,需要构造的xml会比较复杂。网上大家都说XmlBeans不错,这次尝试使用下,以下是具体的应用过程。
1. 准备工作
一、下载XmlBeans
必需的软件:XmlBeans安装包( 我们这里以XmlBeans 2.2.0为例)
二、设置环境变量(windows下和Linux下的基本一致)
(一) 修改PATH 环境变量把xmlbean\bin目录加入:%XMLBEANS_HOME%\bin.
(二) 修改CLASSPATH环境变量,添加XmlBean相关的几个jar包。
2. 定义xml文件格式,及生成xsd文件。
(一) 根据需要定义xml文件格式,可以不添加具体的数据,例如:
<?xml version="1.0" encoding="UTF-8"?> <response > <record> <id/> <order_username/> <order_time/> </record> </response>
(二) 生成xsd文件。
可以使用XMLSPY通过XML文件来生成Schema文件,当然手工写是更好的。网上可以很容易找到XMLSPY。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!--W3C Schema 由 XMLSpy v2006 U 创建 (http://www.altova.com)--> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="id" type="xs:string"/> <xs:element name="order_time" type="xs:string"/> <xs:element name="order_username" type="xs:string"/> <xs:element name="record"> <xs:complexType> <xs:sequence> <xs:element ref="id"/> <xs:element ref="order_username"/> <xs:element ref="order_time"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="response"> <xs:complexType> <xs:sequence> <xs:element ref="record"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
3. 使用XmlBeans命令生成xml对应的jar包和源文件。
scomp -src build\src -out build\testXmlBean.jar schema\test.xsd -compiler
C:\jdk150_12\bin\javac
scomp生成testXmlBean.jar,放在build目录下,同时生成源代码放在build\src下,Schema文件是test.xsd,我们要的是jar文件。
4. 制定testXmlBean.jar中类的路径。
<xb:config xmlns:xb="http://xml.apache.org/xmlbeans/2004/02/xbean/config"> <xb:namespace> <xb:package>test.pkg</xb:package> </xb:namespace> </xb:config>
test.pkg是testXmlBean.jar中的类所在的路径,这个是必须要制定的。
5. 构造xml文件。
根据DB中的数据,构造xml记录,常用于和第三方的数据通讯。
public static String createXML(List testList) { StringBuffer xmlGen = new StringBuffer(); try{ ResponseDocument newPODoc = ResponseDocument.Factory.newInstance(); Response response = newPODoc.addNewResponse(); for(int i = 0; i < testList.size(); i++){ TestDTO testDTO = (TestDTO) testList.get(i); Record record = response.addNewRecord(); record.setId(String.valueOftestDTO.getId))); record.setOrderUsername(testDTO.getUsername()); record.setOrderTime(testDTO.getSubmitdate()); response.setRecordArray(i, record); } //生成xml文件 newPODoc.save(new File("/data/test/test" + DateUtils.dateToLongString(new Date()) + ".xml")); xmlGen.append(newPODoc.xmlText());//xml字符串 }catch(Exception e){ e.printStackTrace(); } return xmlGen.toString(); }