Xmlbean阶段总结

Xmlbean阶段总结

 

当时因为要求方便后续开发 要求使用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的包,还有待测试。

你可能感兴趣的:(xmlbean)