最近的项目中有个生成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();
- }