posts - 43,comments - 75,trackbacks - 0

       一: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 梦源 阅读(3664) 评论(4)  编辑  收藏

FeedBack:
# re: xmlBean 使用心得
2010-01-18 20:49 | 咖啡妆
建议用另外一款gastor 但是感觉这种工具不是很有必要 完全用dom解析也不错 呵呵  回复  更多评论
  
# re: xmlBean 使用心得
2010-01-20 18:26 | 来如风
xstream thoughtworks 出品  回复  更多评论
  
# re: xmlBean 使用心得[未登录]
2010-08-03 16:56 | 5566
很好 学习了  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: