??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲日韩VA无码中文字幕 ,亚洲国产精品丝袜在线观看,亚洲日日做天天做日日谢http://m.tkk7.com/wangxq/category/17204.html共同努力,共造辉?zh-cnThu, 01 Mar 2007 18:24:55 GMTThu, 01 Mar 2007 18:24:55 GMT60[转]Java中四UXML解析技术之不完全测?/title><link>http://m.tkk7.com/wangxq/articles/38199.html</link><dc:creator>扭{乑֝</dc:creator><author>扭{乑֝</author><pubDate>Thu, 30 Mar 2006 01:58:00 GMT</pubDate><guid>http://m.tkk7.com/wangxq/articles/38199.html</guid><wfw:comment>http://m.tkk7.com/wangxq/comments/38199.html</wfw:comment><comments>http://m.tkk7.com/wangxq/articles/38199.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/wangxq/comments/commentRss/38199.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/wangxq/services/trackbacks/38199.html</trackback:ping><description><![CDATA[ <p>自:<a >http://www.5ivb.net/Info/127/Info37906/</a><br /></p> <table class="showinfo" style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" cellspacing="0" cellpadding="3" width="100%" align="center" border="0"> <tbody> <tr> <td class="showTitle" align="middle"> </td> </tr> <tr> <td> <table cellspacing="0" cellpadding="0" align="left" border="0"> <tbody> <tr> <td> <script language="javascript" src="/ad/js/edu_left_300-300.js"> </script> </td> </tr> </tbody> </table>在^时工作中Q难免会遇到把XML作ؓ数据存储格式。面对目前种cȝ多的解决ҎQ哪个最适合我们呢?在这文章中Q我对这四种LҎ做一个不完全评测Q仅仅针寚w历XMLq块来测试,因ؓ遍历XML是工作中使用最多的(臛_我认??<br /><br />  预备 <br /><br />  试环境Q?<br /><br />  AMD毒龙1.4G OC 1.5G?56M DDR333、Windows2000 Server SP4、Sun JDK 1.4.1+Eclipse 2.1+Resin 2.1.8Q在Debug模式下测试?<br /><br />  XML文g格式如下Q?<br /><br />  Q?xml version="1.0" encoding="GB2312"?Q<RESULTQ<VALUEQ?<br /><br />  QNOQA1234Q?NOQ?<br /><br />  QADDRQ四川省XX县XX镇XX路XDXXP/ADDRQ</VALUEQ<VALUEQ?<br /><br />  QNOQB1234Q?NOQ?<br /><br />  QADDRQ四川省XX市XX乡XX村XXl</ADDRQ</VALUEQ</RESULTQ?<br /><br />  试ҎQ?<br /><br />  采用JSP端调用Bean(至于Z么采用JSP来调用,请参考:http://blog.csdn.net/rosen/archive/2004/10/15/138324.aspx)Q让每一U方案分别解?0K?00K?000K?0000K的XML文gQ计其消耗时?单位:毫秒)?<br /><br />  JSP文gQ?<br /><br />  Q?@ page contentType="text/html; charset=gb2312" %Q<%@ page import="com.test.*"%Q?<br /><br />  QhtmlQ<bodyQ<%String args[]={""};MyXMLReader.main(args);%Q</bodyQ</htmlQ?<br /><br />  试 <br /><br />  首先出场的是DOM(JAXP Crimson解析? <br /><br />  DOM是用与^台和语言无关的方式表CXML文档的官方W3C标准。DOM是以层次l构l织的节Ҏ信息片断的集合。这个层ơ结构允许开发h员在树中L特定信息。分析该l构通常需要加载整个文档和构造层ơ结构,然后才能做Q何工作。由于它是基于信息层ơ的Q因而DOM被认为是Z树或Z对象的。DOM以及q义的基于树的处理具有几个优炏V首先,׃树在内存中是持久的,因此可以修改它以便应用程序能Ҏ据和l构作出更改。它q可以在M时候在树中上下DQ而不是像SAX那样是一ơ性的处理。DOM使用h也要单得多?<br /><br />  另一斚wQ对于特别大的文,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这L数据会更好。这些基于事件的模型Q比如SAX?<br /><br />  Bean文gQ?<br /><br />  package com.test; <br /><br />  import java.io.*;import java.util.*;import org.w3c.dom.*;import javax.xml.parsers.*; <br /><br />  public class MyXMLReader{ <br /><br />  public static void main(String arge[]){ <br /><br />  long lasting =System.currentTimeMillis(); <br /><br />  try{ <br /><br />   File f=new File("data_10k.xml"); <br /><br />   DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); <br /><br />   DocumentBuilder builder=factory.newDocumentBuilder(); <br /><br />   Document doc = builder.parse(f); <br /><br />   NodeList nl = doc.getElementsByTagName("VALUE"); <br /><br />   for (int i=0;iQnl.getLength();i++){ <br /><br />    System.out.print("车牌L:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue()); <br /><br />    System.out.println("车主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue()); <br /><br />  } <br /><br />  }catch(Exception e){ <br /><br />   e.printStackTrace(); <br /><br />  } <br /><br />  System.out.println("q行旉Q?+(System.currentTimeMillis() - lasting)+"毫秒");}} <br /><br />  10k消耗时_265 203 219 172 <br /><br />  100k消耗时_9172 9016 8891 9000 <br /><br />  1000k消耗时_691719 675407 708375 739656 <br /><br />  10000k消耗时_OutOfMemoryError <br /><br />  接着是SAX <br /><br />  q种处理的优炚w常类g媒体的优点。分析能够立卛_始,而不是等待所有的数据被处理。而且Q由于应用程序只是在d数据时检查数据,因此不需要将数据存储在内存中。这对于大型文来说是个巨大的优炏V事实上Q应用程序甚至不必解析整个文;它可以在某个条g得到满时停止解析。一般来_SAXq比它的替代者DOM快许多?<br />  选择DOMq是选择SAXQ?<br /><br />  对于需要自q写代码来处理XML文的开发h员来_ <br /><br />  选择DOMq是SAX解析模型是一个非帔R要的设计决策?<br /><br />  DOM采用建立树Şl构的方式访问XML文档Q而SAX采用的事件模型?<br /><br />  DOM解析器把XML文转化Z个包含其内容的树Qƈ可以Ҏq行遍历。用DOM解析模型的优Ҏ~程ҎQ开发h员只需要调用徏树的指oQ然后利用navigation APIs讉K所需的树节点来完成Q务。可以很Ҏ的添加和修改树中的元素。然而由于用DOM解析器的时候需要处理整个XML文Q所以对性能和内存的要求比较高,其是遇到很大的XML文g的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频J的改变的服务中?<br /><br />  SAX解析器采用了Z事g的模型,它在解析XML文的时候可以触发一pd的事Ӟ当发现给定的tag的时候,它可以激zM个回调方法,告诉该方法制定的标签已经扑ֈ。SAX对内存的要求通常会比较低Q因为它让开发h员自己来军_所要处理的tag。特别是当开发h员只需要处理文中所包含的部分数据时QSAXq种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难Q而且很难同时讉K同一个文档中的多处不同数据?<br /><br />  Bean文gQ?<br /><br />  package com.test;import org.xml.sax.*;import org.xml.sax.helpers.*;import javax.xml.parsers.*; <br /><br />  public class MyXMLReader extends DefaultHandler { <br /><br />  java.util.Stack tags = new java.util.Stack(); <br /><br />  public MyXMLReader() { <br /><br />  super();} <br /><br />  public static void main(String args[]) { <br /><br />  long lasting = System.currentTimeMillis(); <br /><br />  try { <br /><br />   SAXParserFactory sf = SAXParserFactory.newInstance(); <br /><br />   SAXParser sp = sf.newSAXParser(); <br /><br />   MyXMLReader reader = new MyXMLReader(); <br /><br />   sp.parse(new InputSource("data_10k.xml"), reader); <br /><br />  } catch (Exception e) { <br /><br />   e.printStackTrace(); <br /><br />  } <br /><br />  System.out.println("q行旉Q? + (System.currentTimeMillis() - lasting) + "毫秒");} <br /><br />  public void characters(char ch[], int start, int length) throws SAXException { <br /><br />  String tag = (String) tags.peek(); <br /><br />  if (tag.equals("NO")) { <br /><br />   System.out.print("车牌LQ? + new String(ch, start, length));}if (tag.equals("ADDR")) { <br /><br />  System.out.println("地址:" + new String(ch, start, length));}} <br /><br />  public void startElement(String uri,String localName,String qName,Attributes attrs) { <br /><br />  tags.push(qName);}} <br /><br />  10k消耗时_110 47 109 78 <br /><br />  100k消耗时_344 406 375 422 <br /><br />  1000k消耗时_3234 3281 3688 3312 <br /><br />  10000k消耗时_32578 34313 31797 31890 30328 <br /><br />  然后是JDOM http://www.jdom.org/ <br /><br />  JDOM的目的是成ؓJava特定文模型Q它化与XML的交互ƈ且比使用DOM实现更快。由于是W一个Java特定模型QJDOM一直得到大力推q和促进。正在考虑通过“Java规范hJSR-102”将它最l用作“Java标准扩展”。从2000q初已l开始了JDOM开发?<br /><br />  JDOM与DOM主要有两斚w不同。首先,JDOM仅用具体类而不使用接口。这在某些方面简化了APIQ但是也限制了灵zL。第二,API大量使用了Collectionsc,化了那些已经熟悉q些cȝJava开发者的使用?<br /><br />  JDOM文声明其目的是“?0%(或更?的精力解?0%(或更?Java/XML问题?Ҏ学习曲线假定?0%)。JDOM对于大多数Java/XML应用E序来说当然是有用的Qƈ且大多数开发者发现API比DOMҎ理解得多。JDOMq包括对E序行ؓ的相当广泛检查以防止用户做Q何在XML中无意义的事。然而,它仍需要您充分理解XML以便做一些超出基本的工作(或者甚至理解某些情况下的错?。这也许是比学习DOM或JDOM接口都更有意义的工作?<br /><br />  JDOM自n不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文(管它还可以以前构造的DOM表示作ؓ输入)。它包含一些{换器以将JDOM表示输出成SAX2事g、DOM模型或XML文本文。JDOM是在Apache许可证变体下发布的开放源码?<br /><br />  Bean文gQ?<br /><br />  package com.test; <br /><br />  import java.io.*;import java.util.*;import org.jdom.*;import org.jdom.input.*; <br /><br />  public class MyXMLReader { <br /><br />  public static void main(String arge[]) { <br /><br />  long lasting = System.currentTimeMillis(); <br /><br />  try { <br /><br />   SAXBuilder builder = new SAXBuilder(); <br /><br />   Document doc = builder.build(new File("data_10k.xml")); <br /><br />   Element foo = doc.getRootElement(); <br /><br />   List allChildren = foo.getChildren(); <br /><br />   for(int i=0;iQallChildren.size();i++) { <br /><br />    System.out.print("车牌L:" + ((Element)allChildren.get(i)).getChild("NO").getText()); <br /><br />    System.out.println("车主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText()); <br /><br />   } <br /><br />  } catch (Exception e) { <br /><br />   e.printStackTrace(); <br /><br />  } <br /><br />  System.out.println("q行旉Q? + (System.currentTimeMillis() - lasting) + "毫秒");}} <br /><br />  10k消耗时_125 62 187 94 <br /><br />  100k消耗时_704 625 640 766 <br /><br />  1000k消耗时_27984 30750 27859 30656 <br /><br />  10000k消耗时_OutOfMemoryError <br /><br />  最后是DOM4J http://dom4j.sourceforge.net/ <br /><br />  虽然DOM4J代表了完全独立的开发结果,但最初,它是JDOM的一U智能分支。它合ƈ了许多超出基本XML文表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或化文的基于事件的处理。它q提供了构徏文表示的选项Q它通过DOM4J API和标准DOM接口hq行讉K功能。从2000下半q开始,它就一直处于开发之中?<br /><br />  为支持所有这些功能,DOM4J使用接口和抽象基本类Ҏ。DOM4J大量使用了API中的Collectionsc,但是在许多情况下Q它q提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是Q虽然DOM4J付出了更复杂的API的代P但是它提供了比JDOM大得多的灉|性?<br /><br />  在添加灵zL、XPath集成和对大文处理的目标ӞDOM4J的目标与JDOM是一LQ针对Java开发者的易用性和直观操作。它q致力于成ؓ比JDOM更完整的解决ҎQ实现在本质上处理所有Java/XML问题的目标。在完成该目标时Q它比JDOM更少防止不正的应用E序行ؓ?<br /><br />  DOM4J是一个非帔R怼U的Java XML APIQ具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的Y件。如今你可以看到来多的Java软g都在使用DOM4J来读写XMLQ特别值得一提的是连Sun的JAXM也在用DOM4J?<br /><br />  Bean文gQ?<br /><br />  package com.test; <br /><br />  import java.io.*;import java.util.*;import org.dom4j.*;import org.dom4j.io.*; <br /><br />  public class MyXMLReader { <br /><br />  public static void main(String arge[]) { <br /><br />  long lasting = System.currentTimeMillis(); <br /><br />  try { <br /><br />   File f = new File("data_10k.xml"); <br /><br />   SAXReader reader = new SAXReader(); <br /><br />   Document doc = reader.read(f); <br /><br />   Element root = doc.getRootElement(); <br /><br />   Element foo; <br /><br />   for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) { <br /><br />    foo = (Element) i.next(); <br /><br />    System.out.print("车牌L:" + foo.elementText("NO")); <br /><br />    System.out.println("车主地址:" + foo.elementText("ADDR")); <br /><br />   } <br /><br />  } catch (Exception e) { <br /><br />   e.printStackTrace(); <br /><br />  } <br /><br />  System.out.println("q行旉Q? + (System.currentTimeMillis() - lasting) + "毫秒");}} <br /><br />  10k消耗时_109 78 109 31 <br /><br />  100k消耗时_297 359 172 312 <br /><br />  1000k消耗时_2281 2359 2344 2469 <br /><br />  10000k消耗时_20938 19922 20031 21078 <br /><br />  JDOM和DOM在性能试时表C佻I在测?0M文时内存溢出。在文档情况下q值得考虑使用DOM和JDOM。虽然JDOM的开发者已l说明他们期望在正式发行版前专注性能问题Q但是从性能观点来看Q它实没有值得推荐之处。另外,DOM仍是一个非常好的选择。DOM实现q泛应用于多U编E语a。它q是许多其它与XML相关的标准的基础Q因为它正式获得W3C推荐(与基于非标准的Java模型相对)Q所以在某些cd的项目中可能也需要它(如在JavaScript中用DOM)?<br /><br />  SAX表现较好Q这要依赖于它特定的解析方式。一个SAX即到来的XML,但ƈ没有载入到内?当然当XML被dӞ会有部分文档暂时隐藏在内存中)?<br /><br />  无疑QDOM4J是这场测试的莯者,目前许多开源项目中大量采用DOM4JQ例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文g。如果不考虑可移植性,那就采用DOM4J吧!(?rosenQ?/td> </tr> </tbody> </table> <img src ="http://m.tkk7.com/wangxq/aggbug/38199.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/wangxq/" target="_blank">扭{乑֝</a> 2006-03-30 09:58 <a href="http://m.tkk7.com/wangxq/articles/38199.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]利用XMLBean轻轻松松dXMLhttp://m.tkk7.com/wangxq/articles/38196.html扭{乑֝扭{乑֝Thu, 30 Mar 2006 01:53:00 GMThttp://m.tkk7.com/wangxq/articles/38196.htmlhttp://m.tkk7.com/wangxq/comments/38196.htmlhttp://m.tkk7.com/wangxq/articles/38196.html#Feedback0http://m.tkk7.com/wangxq/comments/commentRss/38196.htmlhttp://m.tkk7.com/wangxq/services/trackbacks/38196.html版权声明Q本文可以自p{载,转蝲时请务必以超链接形式标明文章原始出处和作者信息及本声?/span>
作?叶枫(http://blog.matrix.org.cn/page/叶枫)
原文:[http://www.matrix.org.cn/resource/article/44/44027_XMLBean.html]http://www.matrix.org.cn/resource/article/44/44027_XMLBean.html[/url]
关键?XML XMLBean Parser

一、关于XML解析

  XML在Java应用E序里变得越来越重要, q泛应用于数据存储和
交换. 比如我们常见的配|文?都是以XML方式存储? XMLq应?br />于Java Message Service和Web Services{技术作为数据交?
因此,正确dXML文是XML应用的基.
  Java提供了SAX和DOM两种方式用于解析XML,但即便如?要读写一?br />E微复杂的XML,也不是一件容易的?

二、XMLBean?/span>

    Hibernate已经成ؓ目前行的面向Java环境的对?关系数据库映工?
在Hibernate{对?关系数据库映工具出C?Ҏ据库的操作是
通过JDBC来实现的,Ҏ据库的Q何操?开发h员都要自己写SQL语句
来实? 对象/关系数据库映工具出现后,Ҏ据库的操作{成对
JavaBean的操?极大方便了数据库开? 所以如果有一个类似的工具能够
实现对XML的读写{成对JavaBean的操?会化XML的读?即对XML
不熟悉的开发h员也能方便地dXML. q个工具是XMLBean.

三、准备XMLBean和XML文档

   XMLBean是Apache的一个开源项?可以从http://www.apache.org下蝲,
最新的版本?.0. 解压后目录如?
xmlbean2.0.0
     +---bin
     +---docs
     +---lib
     +---samples
     +---schemas


另外q要准备一个XML文档(customers.xml),
在本文的例子?我们对q个文档q行d操作. 文档源码如下:

<?xml version="1.0" encoding="UTF-8"?>
<Customers>
    <customer>
            <id>1</id>
            <gender>female</gender>
            <firstname>Jessica</firstname>
            <lastname>Lim</lastname>
            <phoneNumber>1234567</phoneNumber>
            <address>
                <primaryAddress>
                        <postalCode>350106</postalCode>
                        <addressLine1>#25-1</addressLine1>
                        <addressLine2>SHINSAYAMA 2-CHOME</addressLine2>
                </primaryAddress>
                <billingAddress>
                        <receiver>Ms Danielle</receiver>
                        <postalCode>350107</postalCode>
                        <addressLine1>#167</addressLine1>
                        <addressLine2>NORTH TOWER HARBOUR CITY</addressLine2>
                </billingAddress>
            </address>
    </customer>
    <customer>
            <id>2</id>
            <gender>male</gender>
            <firstname>David</firstname>
            <lastname>Bill</lastname>
            <phoneNumber>808182</phoneNumber>
            <address>
                <primaryAddress>
                        <postalCode>319087</postalCode>
                        <addressLine1>1033 WS St.</addressLine1>
                        <addressLine2>Tima Road</addressLine2>
                </primaryAddress>
                <billingAddress>
                        <receiver>Mr William</receiver>
                        <postalCode>672993</postalCode>
                        <addressLine1>1033 WS St.</addressLine1>
                        <addressLine2>Tima Road</addressLine2>
                </billingAddress>
            </address>
    </customer>
</Customers>


q是一个客L数据模型,每个客户都有客户~号(ID),姓名,性别(gender),
电话L(phoneNumber)和地址,其中地址有两? 首要地址(PrimaryAddress)
和帐单地址(BillingAddress),每个地址有邮~?地址1,和地址2l成.
其中帐单地址q有收g?receiver).

    此外,q要准备一个配|文?文g名customer.xsdconfig),q个文g?br />作用我后面会?它的内容如下:

<xb:config xmlns:xb="http://xml.apache.org/xmlbeans/2004/02/xbean/config">

  <xb:namespace>
    <xb:package>sample.xmlbean</xb:package>
  </xb:namespace>

</xb:config>


四、XMLBean使用步骤

    和其他面向Java环境的对?关系数据库映工L使用步骤一?
在正式用XMLBean?我们要作两个准备.

    1. 生成XML Schema文g

       什么是XML Schema文g? 正常情况?每个XML文g都有一个Schema文g,
       XML Schema文g是一个XML的约束文?它定义了XML文g的结构和元素.
       以及对元素和l构的约? 通俗地讲,如果说XML文g是数据库里的记录,
       那么Schema是表结构定?

       Z么需要这个文? XMLBean需要通过q个文g知道一个XML文g?br />       l构以及U束,比如数据cd{? 利用q个Schema文g,XMLBean会产生
       一pd相关的Java Classes来实现对XML的操? 而作为开发h?则是
       利用XMLBean产生的Java Classes来完成对XML的操作而不需要SAX或DOM.

       怎样产生q个Schema文g? 如果对于熟悉XML的开发h?可以自己?br />       写这个Schema文g,对于不熟悉XML的开发h?可以通过一些工h完成.
       比较有名的如XMLSPY和Stylus Studio都可以通过XML文g来生成Schema
       文g. 加入我们已经生成q个Schema文g(customer.xsd):
      

       <?xml version="1.0" encoding="UTF-8"?>
       <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
                  elementFormDefault="qualified">
         <xs:element name="Customers">
           <xs:complexType>
             <xs:sequence>
               <xs:element maxOccurs="unbounded" name="customer"
                           type="customerType"/>
             </xs:sequence>
           </xs:complexType>
         </xs:element>
       <xs:complexType name="customerType">
             <xs:sequence>
               <xs:element name="id" type="xs:int"/>
               <xs:element name="gender" type="xs:string"/>
               <xs:element name="firstname" type="xs:string"/>
               <xs:element name="lastname" type="xs:string"/>
               <xs:element name="phoneNumber" type="xs:string"/>
               <xs:element name="address" type="addressType"/>
             </xs:sequence>
       </xs:complexType>
         <xs:complexType name="addressType">
             <xs:sequence>
               <xs:element name="primaryAddress" type="primaryAddressType"/>
               <xs:element name="billingAddress" type="billingAddressType"/>
             </xs:sequence>
         </xs:complexType>

         <xs:complexType name="primaryAddressType">
             <xs:sequence>
               <xs:element name="postalCode" type="xs:string"/>
               <xs:element name="addressLine1" type="xs:string"/>
               <xs:element name="addressLine2" type="xs:string"/>
             </xs:sequence>
         </xs:complexType>
         <xs:complexType name="billingAddressType">
             <xs:sequence>
                   <xs:element name="receiver" type="xs:string"/>
               <xs:element name="postalCode" type="xs:string"/>
               <xs:element name="addressLine1" type="xs:string"/>
               <xs:element name="addressLine2" type="xs:string"/>
             </xs:sequence>
         </xs:complexType>
       </xs:schema>
      


    2. 利用scomp来生成Java Classes

       scomp是XMLBean提供的一个编译工?它在bin的目录下. 通过q个工具,
       我们可以以上的Schema文g生成Java Classes.
       scomp的语法如?-

      

       scomp [options] [dirs]* [schemaFile.xsd]* [service.wsdl]* [config.xsdconfig]*
      


       主要参数说明:
       -src [dir]                  -- 生成的Java Classes存放目录
     -srconly                  -- 不编译Java Classes,不生Jar文g
     -out [jarFileName]  -- 生成的Jar文g,~省是xmltypes.jar
       -compiler                 -- Java~译器的路径,即Javac的位|?br />       schemaFile.xsd    -- XML Schema文g位置
       config.xsdconfig   -- xsdconfig文g的位|? q个文g主要用来制定生成的Java Class
                              的一些文件名规则和Package的名U?在本?package是sample.xmlbean

       在本?我是q样q行?
      

       scomp -src build\src  -out build\customerXmlBean.jar schema\customer.xsd
             -compiler C:\jdk142_04\bin\javac customer.xsdconfig
      


       q个命o行的意思是告诉scomp生成customerXmlBean.jar,攑֜build目录?同时
       生成源代码放在build\src? Schema文g是customer.xsd,xsdconfig文g是customer.xsdconfig.

       其实, 生成的Java源代码没有多大作?我们要的是jar文g.我们先看一下build\src\sample\xmlbean下生成的Classes.
      

          CustomersDocument.java    -- 整个XML文的Java Class映射
       CustomerType.java              -- 节点sustomer的映?br />       AddressType.java                 -- 节点address的映?br />       BillingAddressType.java        -- 节点billingAddress的映?br />       PrimaryAddressType.java      -- 节点primaryAddress的映?br />    


       好了,到此我们所有的准备工作已经完成? 下面开始进入重点:利用刚才生成的jar文gdXML.

五、利用XMLBean读XML文g

    新徏一个Java Project,XMLBean2.0.0\lib\下的Jar文g和刚才我们生成的customerXmlBean.jar加入
    到Project的ClassPath.

    新徏一个Java Class: CustomerXMLBean.  源码如下:
    

    package com.sample.reader;

    import java.io.File;
    
    import sample.xmlbean.*;
    import org.apache.commons.beanutils.BeanUtils;
    import org.apache.xmlbeans.XmlOptions;
    public class CustomerXMLBean {
    private String filename = null;
    
    public CustomerXMLBean(String filename) {
            super();
            this.filename = filename;
    }

    public void customerReader() {
            try {
              File xmlFile = new File(filename);
              CustomersDocument doc = CustomersDocument.Factory.parse(xmlFile);
              CustomerType[] customers = doc.getCustomers().getCustomerArray();
          
              for (int i = 0; i < customers.length; i++) {
                CustomerType customer = customers[i];
                println("Customer#" + i);
                println("Customer ID:" + customer.getId());
                println("First name:" + customer.getFirstname());
                println("Last name:" + customer.getLastname());
                println("Gender:" + customer.getGender());
                println("PhoneNumber:" + customer.getPhoneNumber());
                // Primary address
                PrimaryAddressType primaryAddress = customer.getAddress().getPrimaryAddress();
                println("PrimaryAddress:");
                println("PostalCode:" + primaryAddress.getPostalCode());
                println("AddressLine1:" + primaryAddress.getAddressLine1());
                println("AddressLine2:" + primaryAddress.getAddressLine2());
                // Billing address
                BillingAddressType billingAddress = customer.getAddress().getBillingAddress();
                println("BillingAddress:");
                println("Receiver:" + billingAddress.getReceiver());
                println("PostalCode:" + billingAddress.getPostalCode());
                println("AddressLine1:" + billingAddress.getAddressLine1());
                println("AddressLine2:" + billingAddress.getAddressLine2());
            
              }
            } catch (Exception ex) {
                    ex.printStackTrace();
            }
    }
    private void println(String str) {
          System.out.println(str);
    }
   public static void main(String[] args) {
      String filename = "F://JavaTest//Eclipse//XMLBean//xml//customers.xml";
                  
     CustomerXMLBean customerXMLBean = new CustomerXMLBean(filename);
                   customerXMLBean.customerReader();
    }

    }
    


    q行?参看输出l果:
    

       Customer#0
       Customer ID:1
       First name:Jessica
       Last name:Lim
       Gender:female
       PhoneNumber:1234567
       PrimaryAddress:
       PostalCode:350106
       AddressLine1:#25-1
       AddressLine2:SHINSAYAMA 2-CHOME
       BillingAddress:
       Receiver:Ms Danielle
       PostalCode:350107
       AddressLine1:#167
       AddressLine2:NORTH TOWER HARBOUR CITY

       Customer#1
       Customer ID:2
       First name:David
       Last name:Bill
       Gender:male
       PhoneNumber:808182
       PrimaryAddress:
       PostalCode:319087
       AddressLine1:1033 WS St.
       AddressLine2:Tima Road
       BillingAddress:
       Receiver:Mr William
       PostalCode:672993
       AddressLine1:1033 WS St.
       AddressLine2:Tima Road
    

    怎么?是不是很L? XMLBean的威?

六、利用XMLBean写XML文g

    利用XMLBean创徏一个XML文档也是一件轻而易丄?我们再增加一个Method,
    L一下的Java Class:
    

    public void createCustomer() {
    try {
        // Create Document
        CustomersDocument doc = CustomersDocument.Factory.newInstance();
        // Add new customer
        CustomerType customer = doc.addNewCustomers().addNewCustomer();
        // set customer info
        customer.setId(3);
        customer.setFirstname("Jessica");
        customer.setLastname("Lim");
        customer.setGender("female");
        customer.setPhoneNumber("1234567");
        // Add new address
        AddressType address = customer.addNewAddress();
        // Add new PrimaryAddress
        PrimaryAddressType primaryAddress = address.addNewPrimaryAddress();
        primaryAddress.setPostalCode("350106");
        primaryAddress.setAddressLine1("#25-1");
        primaryAddress.setAddressLine2("SHINSAYAMA 2-CHOME");

        // Add new BillingAddress
        BillingAddressType billingAddress = address.addNewBillingAddress();
        billingAddress.setReceiver("Ms Danielle");
        billingAddress.setPostalCode("350107");
        billingAddress.setAddressLine1("#167");
        billingAddress.setAddressLine2("NORTH TOWER HARBOUR CITY");

        File xmlFile = new File(filename);
        doc.save(xmlFile);
        } catch (Exception ex) {
                ex.printStackTrace();
        }

  }
    

    修改main method.
    

    public static void main(String[] args) {
    String filename = "F://JavaTest//Eclipse//XMLBean//xml//customers_new.xml";
        CustomerXMLBean customerXMLBean = new CustomerXMLBean(filename);
        customerXMLBean.createCustomer();
    }
    

    q行,打开customers_new.xml:
    

    <?xml version="1.0" encoding="UTF-8"?>
    <Customers>
    <customer>
            <id>3</id>
            <gender>female</gender>
            <firstname>Jessica</firstname>
            <lastname>Lim</lastname>
            <phoneNumber>1234567</phoneNumber>
            <address>
                    <primaryAddress>
                         <postalCode>350106</postalCode>
                         <addressLine1>#25-1</addressLine1>
                                       <addressLine2>SHINSAYAMA 2-CHOME</addressLine2>
                    </primaryAddress>
                    <billingAddress>
                        <receiver>Ms Danielle</receiver>
                        <postalCode>350107</postalCode>
                       <addressLine1>#167</addressLine1>
                       <addressLine2>NORTH TOWER HARBOUR CITY</addressLine2>
                    </billingAddress>
                    </address>
            </customer>
    </Customers>
    



七、利用XMLBean修改XML文g

    我们再增加一个Method:
    

      public void updateCustomer(int id,String lastname) {
         try {
        File xmlFile = new File(filename);
        CustomersDocument doc = CustomersDocument.Factory.parse(xmlFile);
        CustomerType[] customers = doc.getCustomers().getCustomerArray();
      
        for (int i = 0; i < customers.length; i++) {
           CustomerType customer = customers[i];
          if(customer.getId()==id){
                customer.setLastname(lastname);
                break;
            }
        }
        doc.save(xmlFile);
         } catch (Exception ex) {
          ex.printStackTrace();
         }
           }
    

    main method:
    

    public static void main(String[] args) {
     String filename = "F://JavaTest//Eclipse//XMLBean//xml//customers_new.xml";
                    
    CustomerXMLBean customerXMLBean = new CustomerXMLBean(filename);
                    
    customerXMLBean.updateCustomer(3,"last");
    }
    

    q行之后,我们会看到客户~号?的客Llastname已经改ؓlast.

八、利用XMLBean删除一个customer

    再增加一个Method:
    

    public void deleteCustomer(int id) {
     try {
      File xmlFile = new File(filename);
     CustomersDocument doc = CustomersDocument.Factory.parse(xmlFile);
    CustomerType[] customers = doc.getCustomers().getCustomerArray();

   for (int i = 0; i < customers.length; i++) {
        CustomerType customer = customers[i];
        if(customer.getId()==id){
                        customer.setNil() ;
                        break;
               }
   }
   doc.save(xmlFile);
   } catch (Exception ex) {
        ex.printStackTrace();
        }
   }


         main method:
    

    public static void main(String[] args) {
    String filename = "F://JavaTest//Eclipse//XMLBean//xml//customers_new.xml";
                    
    CustomerXMLBean customerXMLBean = new CustomerXMLBean(filename);
                    
    customerXMLBean.deleteCustomer(3);
    }

        
q行,我们会看到客户~号?的客L资料已经被删?

九、查询XML

    除了本文在以上讲q的,利用XMLBean能轻L村֮成XML的读写操作外,l合XPath和XQuery,
   XMLBeanq能完成象SQL查询数据库一h便地查询XML数据. 关于XML查询以及如何创徏XML数据? 我将在另一文章里讨论.



十、结束语
    XMLBean能帮助我们轻易读写XML,q将有助于我们降低XML的学习和使用,有了q个基础,
    开发h员将为学习更多地XML相关技术和Web Services,JMS{其他J2EE技术打下良好地基础.


关于作者:
叶枫Q热爱Java和Oracle. 在Y件开发有q?0q? 目前在国外一家美国大公司担QSA, 负责技术研I。作者BlogQ?a target="_new">http://blog.matrix.org.cn/page/叶枫


扭{乑֝ 2006-03-30 09:53 发表评论
]]>
վ֩ģ壺 AVһþ| պѹۿ| ޾Ʒ| aëƬȫƵ| ˳վ߲ӰԺ| | þþƷ˵| պƷƵ߹ۿ| ںӰԺ߹ۿƵ| 4338ȫɫվ| һһͰһƵ| þ޹˾Ʒ| j8ֳִӲˬƵ| 91߾Ʒ| ޼ƵͼƬ| aƬ߹ۿ| AVһ| 91ѹۿ| Ļߵ| ȫ߹ۿѹۿȫ | ѹۿƬëƬ| Ʒ޾Ʒպͼ| ޻ƬëƬ߹ۿ| Ƭѹۿȫ| һ| պһ| 2021ƷƷѹۿ| ľƷAVƬ| 99ƷƵ߹ۿ| ששר2023| ŷ޾þþþƷ| ĻȫĻ| AVþþþվ| ҹϼӰԺ| 99ƷƵ| ŷպٲ| ĻͼƬ| ߹ۿѸƵ| ݺȾƷѹۿ| ޾ƷĻӰԺ| һ|