xmlBean 使用心得
一:xmlBean对开发人员来说是比较好的,因为它大大减少开发人员的代码量,但是也有一些不足之处。下面我们细细说来:
二: xmlBean 从名字大家一般都能看出来,就是对xml文件的操作转换成javaBean的方式进行操作。
三: 首先:在项目中我们一般都是先定义出xml文件的一个样例,确定大家交换数据的xml格式,例如以下xml文件的样式
<?xml version="1.0" encoding="UTF-8"?>
<EBApp>
<Head>
<TaskID>dfjdk</TaskID>
<DealCode>dfjd</DealCode>
<DealContent>dfjdk</DealContent>
</Head>
<Body>
<BatchNo>dfj</BatchNo>
<BillNo>dfj</BillNo>
<AccountResult>dfjdkfj</AccountResult>
</Body>
</EBApp>
四:xml文件确定下来之后,然后就是对xml的解析,创建操作。在这里我们使用xmlBean对xml文件进行操作。
首先下载xmlBean(去google搜索,就知道到哪里下载了),下载之后解压到任意目录,
在“我的计算机”--“高级”--“环境变量” 中配置XMLBEANS_HOME 指向你解压的目录。
在PATH中 配置%XMLBEANS_HOME%\bin ,这样xmlBean 的环境配置好了
五: xmlBean需要xml文件的xsd。使用xmlSpy生成对应xml文件的xsd文件
cmsQueryDiscRele.xsd 内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified" targetNamespace="http://hermes.abc.com/elecbill/cms/discRele" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="EBApp">
<xs:complexType>
<xs:sequence>
<xs:element name="Head">
<xs:complexType>
<xs:sequence>
<xs:element name="TaskID" type="xs:string"/>
<xs:element name="DealCode" type="xs:string"/>
<xs:element name="DealContent" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Body">
<xs:complexType>
<xs:sequence>
<xs:element name="BatchNo" type="xs:string"/>
<xs:element name="BillNo" type="xs:string"/>
<xs:element name="AccountResult" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
“targetNamespace”,“elementFormDefault”这两个attribute必须存在。并且elementFormDefault为qualified
为什么要使用targetNamespace在后面将讲到。
六:有xsd文件之后就可以使用xmlBean工具了,将cmsQueryDiscRele.xsd放到d盘下(你可以自己放置到任意目录下)
在命令行中输入 cd 到 d:\ 下
然后 scomp -src build\src -out build\her.jar cmsQueryDiscRele.xsd
-compiler D:\Java\jdk1.5\bin\javac
这样就生成her.jar文件了,her.jar就是对上面xml文件的javaBean映射了
七:解析范例:
EBAppDocument ad = EBAppDocument.Factory.parse(message);
ad.getEBApp().getHead().getTaskID();
ad.getEBApp().getHead().getDealCode());
ad.getEBApp().getHead().getDealContent();
ad.getEBApp().getBody().getBatchNo();
ad.getEBApp().getBody().getBillNo();
八:生成xml范例:
EBAppDocument ebappd = EBAppDocument.Factory.newInstance();
EBAppDocument.EBApp ebapp = ebappd.addNewEBApp();
EBAppDocument.EBApp.Head head = ebapp.addNewHead();
head.setTaskID("");
head.setDealCode("");
head.setDealContent("");
EBAppDocument.EBApp.Body body = ebapp.addNewBody();
body.setBatchNo("");
body.setAccountResult("");
body.setBillNo("");
ebappd.xmlText();
九:现在讲讲为什么要使用targetNamespace:在项目中我们定义的xml文件不可能就一种格式,
而xmlBean将 xml文件映射到javaBean时,xml根节点就是Bean中最外层的Bean名称,例如上面的xml文件
根节点为 <EBApp>,对应的为EBAppDocument 。而同一个项目的根节点一般都相同,只是里面的子节点在不
断的发生变化。那么如果没有targetNamespace attribute,生成的EBAppDocument 就会重复,所以我们只有
通过包名进行分类了,例如 a包下的EBAppDocument,b包下的EBAppDocument,targetNamespace就是生成包名结构。
十:另外在使用生成的EBAppDocument.Factory.parse,进行解析xml文件时,如果传过来的xml文件中没有xmlns
attribute ,则解析也会有问题,不过xmlBean考虑了这个问题,可以使用如下操作
XmlOptions op = new XmlOptions();
Map map = new HashMap();
map.put("", "http://hermes.abc.com/elecbill/cms/");
map.put(oldNameSpace, nameSpace);
op.setLoadSubstituteNamespaces(map);
EBAppDocument.Factory.parse(XmlOptions op),
这样解析就没问题了。
十一:另外在生成xml时,由于存在targetNamespace,生成的xml文件每个elements开头都有一个 "cms:", 这是
targetNamespace 的缩写,是取你targetNamespace的最后字符,如果想去掉这给可是使用xmlBean的方法
XmlOptions op = new XmlOptions();
op.setUseDefaultNamespace();
ebappd.xmlText(op);
这样就可以了。
十二:未解决问题、当你在xsd中指定targetNamespace时,在使用xmlBean生成的xml文件中会发现多了
一个 xmlns="http://hermes.abc.com/elecbill/cms/" attribute,而且这个attribute怎么也没有办法去掉
(本人现在是没办法,如果有人知道,可以交流一下)。