当时因为要求方便后续开发 要求使用xmlbean方式来生成xml,至于为什么要这种方式,怎么个方便,理由很多,大脑装不下,只得左耳进左耳出(其实压根就没进),只好硬着头皮网上找资料学,后又要求总结成文档发给大家。估计没人看,竟然查点当垃圾一样丢掉(被偶尔从垃圾堆路过的我给翻出来),不行,我得粘到网上,不管好不好,当时费劲巴拉的。
Java对xml操作很多 ,dom4j,SAX方式就不说了,介绍xmlbean方式
神奇的 CTRL V.............................//
xmlbeans的主要特点:
1、对schema生成强Java类型
2、生成的类型可以读取相应schema的文档,或者DOM
3、加载数据后可以根据schema验证.
4、可以对XmlObject取得对应的SchemaType知道其Schema定义.这是dom3的特性
内建xpath查询
5、强大的输出到xml.(最简单的方法是toString())
研究不是很深,只是在项目中用到第1、5条:
首先从APACHE上下载最新的xmlbeans的包(目前最新版为xmlbeans-2.5.0)。
做一个简单的例子,公司和员工的模型,公司company的属性有名称name、地址address和员工列表emplist,其中雇员列表中的employe又包含姓名name、性别sex和年龄age。现在需要使用xmlbean生成一个类似下边xml格式的一个文件。
<?xml version='1.0' encoding='UTF-8' ?>
<company>
<cname>XX科技股份有限公司</cname>
<address>海淀XX路XXXX软件园</address>
<emplist>
<employee>
<name>李四</ename>
<sex>男</sex>
<age>28</age>
<employee>
<employee>
<name>张三</ename>
<sex>男</sex>
<age>32</age>
<employee>
……
</emplist>
<company>
Xmlbean生成文件的过程是先构造一个此结构的java对象,再讲此java对象输出成xml格式文档。
1、 构造java对象
构造此对象需要先写一个schema定义文件(类似wsdl),后缀名为.xsd。例如以下的test.xsd
<?xmlversion="1.0"encoding="UTF-8"?>
<schematargetNamespace="http://www.example.org"xmlns:tns="http://www.example.org"xmlns="http://www.w3.org/2001/XMLSchema">
<complexTypename="company">
<sequence>
<elementname="name"type="string"minOccurs="0"maxOccurs="1"/>
<elementname="address"type="string"minOccurs="0"maxOccurs="1"/>
<elementname="emplist"type="tns:emplist"minOccurs="0"maxOccurs="1"/>
</sequence>
</complexType>
<complexTypename="emplist">
<sequence>
<elementname="name"type="string"minOccurs="0"maxOccurs="1"/>
<elementname="sex"type=" string "minOccurs="0"maxOccurs="1"/>
<elementname="age"type="short"minOccurs="0"maxOccurs="1"/>
</sequence>
</complexType>
</schema>
使用test.xsd生成相应的JAR包。xmlbeans-2.5.0提供了相应的命令,编写批处理文件xml.bat:
set JAVA_HOME=C:\jdk150_06
set XMLBEANS_HOME=C:\xmlbeans-2.5.0
set PATH=%JAVA_HOME%\bin;%XMLBEANS_HOME%\bin
echo "正在生成相应JAR..."
scomp.cmd %XMLBEANS_HOME%\test.xsd -out %XMLBEANS_HOME%\XmlBeans.jar
注意:绿色部分根据自己环境设置
2、 由Javabean生成文档
将jar加入工程,编写测试类XmlTest.java:
//创建公司
CompanyDocument companydoc = CompanyDocument.Factory.newInstance();
Company company = companydoc.addNewCompany();
company.setName("瑞友科技股份有限公司");
company.setAddress("海淀区北清路永丰用友软件园");
//添加第一个员工
Emplist emplist1 = company.addNewEmplist();
emplist1.setName("李四");
emplist1.setSex("男");
emplist1.setAge((short)28);
//添加第二个员工
Emplist emplist2 = company.addNewEmplist();
emplist2.setName("张三");
emplist2.setSex("男");
emplist2.setAge((short)32);
String xmlStr = companydoc.toString();
以下是测试类输出内容:
<company xmlns="http://www.example.org">
<name xmlns="">XX股份有限公司</name>
<address xmlns="">海淀区XX路XXXX软件园</address>
<emplist xmlns="">
<name>李四</name>
<sex>男</sex>
<age>28</age>
</emplist>
<emplist xmlns="">
<name>张三</name>
<sex>男</sex>
<age>32</age>
</emplist>
</company>
根据输出即可根据要求生成文件。
xmlBean使用中遇见的问题:
在网上也有一些使用xmlbean的问题,感觉比较有参考性的摘录下来
1.默认根据xsd生成的java类,namespace定义的名字,(本例用的targetNamespace="http://www.example.org"),如果没有定义xsd的namespace就默认为noNamespace。用这些java类生成出来的xml文件也自动带有namespace。其实这是很烦的事情,因为我们通常希望生成出来的xml文件没有namespace。
解决办法:没有给。
说明:目前我采取办法是将生成字符串再截取一遍,将没用的namespace去掉。我用的是笨方法,应该还有其他方试。
2. xsdConfig可以定义出一个namespace和package的对应关系,可如果我有两个无namespace的文件,我打算生成到两个package中,怎么办?
答案:没好办法,把两套xsd/xsdConfig文件放置在两个目录,然后在ant脚本中做两个target,再写一个target调用这两个target好了。如果时再bea的workshop中,需要建立两个schema project。
说明:此配置应该是再解析时遇到的,此次EBP的FTP服务没有用到,所以我还没有试过。
3.但apache的xmlbean和bea公司的xmlbean有冲突,因为他们都用到了javax.xml.namespace.QName,不幸,他们用的是同名但又不相同的类,而且差异较大。所以如果在一个app中,如果即用了apache的又用了bea的,哪就只有一个能用,就看哪一个QName先被实例化了。
解决办法就是:如果项目中用了weblogic,哪就用bean的xmlbean,反正一样可以用。两者的ant脚本基本一样,就是taskdef不一样而已。
apache的taskdef:
<taskdef name="xmlbean"
classname="org.apache.xmlbeans.impl.tool.XMLBean"
classpathref="lib.xmlbean.apace"/>
bean的taskdef
<taskdef name="xmlbean"
classname="com.bea.xbean.tool.XMLBean"
classpathref="lib.xmlbean.bea"/>
说明:虽说xmlbean是bea送给apache的,但是反编译了一下大致看了看,确实像上边所说。由于ebp180服务器是weblogic,所以应用中最好使用weblogic自带的。将其替换掉本例中apache的包,还有待测试。