一: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怎么也沒有辦法去掉
(本人現在是沒辦法,如果有人知道,可以交流一下)。
posted on 2010-01-18 16:15
夢源 閱讀(3697)
評論(4) 編輯 收藏