??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲黄色免费,国产资源在线观看入口av,国产亚洲人成a在线v网站http://www.aygfsteel.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://www.aygfsteel.com/wangxq/articles/38199.html</link><dc:creator>扭{乑֝</dc:creator><author>扭{乑֝</author><pubDate>Thu, 30 Mar 2006 01:58:00 GMT</pubDate><guid>http://www.aygfsteel.com/wangxq/articles/38199.html</guid><wfw:comment>http://www.aygfsteel.com/wangxq/comments/38199.html</wfw:comment><comments>http://www.aygfsteel.com/wangxq/articles/38199.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wangxq/comments/commentRss/38199.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wangxq/services/trackbacks/38199.html</trackback:ping><description><![CDATA[ <p>自:(x)<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难免会(x)遇到把XML作ؓ(f)数据存储格式。面对目前种cȝ多的解决Ҏ(gu)Q哪个最适合我们呢?在这文章中Q我对这四种LҎ(gu)做一个不完全评测Q仅仅针寚w历XMLq块来测试,因ؓ(f)遍历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?jng)XX乡XX村XXl</ADDRQ</VALUEQ</RESULTQ?<br /><br />  试Ҏ(gu)Q?<br /><br />  采用JSP端调用Bean(至于Z么采用JSP来调用,请参考:(x)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织的节Ҏ(gu)信息片断的集合。这个层ơ结构允许开发h员在?wi)中L特定信息。分析该l构通常需要加载整个文档和构造层ơ结构,然后才能做Q何工作。由于它是基于信息层ơ的Q因而DOM被认为是Z?wi)或Z对象的。DOM以及(qing)q义的基于树(wi)的处理具有几个优炏V首先,׃?wi)在内存中是持久的,因此可以修改它以便应用程序能?gu)据和l构作出更改。它q可以在M时候在?wi)中上下DQ而不是像SAX那样是一ơ性的处理。DOM使用h也要单得多?<br /><br />  另一斚wQ对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这L(fng)数据?x)更好。这些基于事件的模型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(fng):" + 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消耗时_(d)(x)265 203 219 172 <br /><br />  100k消耗时_(d)(x)9172 9016 8891 9000 <br /><br />  1000k消耗时_(d)(x)691719 675407 708375 739656 <br /><br />  10000k消耗时_(d)(x)OutOfMemoryError <br /><br />  接着是SAX <br /><br />  q种处理的优炚w常类g媒体的优点。分析能够立卛_始,而不是等待所有的数据被处理。而且Q由于应用程序只是在d数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优炏V事实上Q应用程序甚至不必解析整个文档;它可以在某个条g得到满时停止解析。一般来_(d)SAXq比它的替代者DOM快许多?<br />  选择DOMq是选择SAXQ?<br /><br />  对于需要自q写代码来处理XML文档的开发h员来_(d) <br /><br />  选择DOMq是SAX解析模型是一个非帔R要的设计决策?<br /><br />  DOM采用建立?wi)Şl构的方式访问XML文档Q而SAX采用的事件模型?<br /><br />  DOM解析器把XML文档转化Z个包含其内容的树(wi)Qƈ可以Ҏ(gu)(wi)q行遍历。用DOM解析模型的优Ҏ(gu)~程Ҏ(gu)Q开发h员只需要调用徏?wi)的指o(h)Q然后利用navigation APIs讉K所需的树(wi)节点来完成Q务。可以很Ҏ(gu)的添加和修改?wi)中的元素。然而由于用DOM解析器的时候需要处理整个XML文档Q所以对性能和内存的要求比较高,其是遇到很大的XML文g的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频J的改变的服务中?<br /><br />  SAX解析器采用了(jin)Z事g的模型,它在解析XML文档的时候可以触发一pd的事Ӟ当发现给定的tag的时候,它可以激zM个回调方法,告诉该方法制定的标签已经扑ֈ。SAX对内存的要求通常?x)比较低Q因为它让开发h员自己来军_所要处理的tag。特别是当开发h员只需要处理文档中所包含的部分数据时QSAXq种扩展能力得到?jin)更好的体现。但用SAX解析器的时候编码工作会(x)比较困难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("车牌L(fng)Q? + 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消耗时_(d)(x)110 47 109 78 <br /><br />  100k消耗时_(d)(x)344 406 375 422 <br /><br />  1000k消耗时_(d)(x)3234 3281 3688 3312 <br /><br />  10000k消耗时_(d)(x)32578 34313 31797 31890 30328 <br /><br />  然后是JDOM http://www.jdom.org/ <br /><br />  JDOM的目的是成ؓ(f)Java特定文档模型Q它化与XML的交互ƈ且比使用DOM实现更快。由于是W一个Java特定模型QJDOM一直得到大力推q和?j)进。正在考虑通过“Java规范hJSR-102”将它最l用作“Java标准扩展”。从2000q初已l开始了(jin)JDOM开发?<br /><br />  JDOM与DOM主要有两斚w不同。首先,JDOM仅用具体类而不使用接口。这在某些方面简化了(jin)APIQ但是也限制?jin)灵zL。第二,API大量使用?jin)Collectionsc,化了(jin)那些已经熟?zhn)q些cȝJava开发者的使用?<br /><br />  JDOM文档声明其目的是“?0%(或更?的精力解?0%(或更?Java/XML问题?Ҏ(gu)学习(fn)曲线假定?0%)。JDOM对于大多数Java/XML应用E序来说当然是有用的Qƈ且大多数开发者发现API比DOMҎ(gu)理解得多。JDOMq包括对E序行ؓ(f)的相当广泛检查以防止用户做Q何在XML中无意义的事。然而,它仍需要?zhn)充分理解XML以便做一些超出基本的工作(或者甚至理解某些情况下的错?。这也许是比学习(fn)DOM或JDOM接口都更有意义的工作?<br /><br />  JDOM自n不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档(管它还可以以前构造的DOM表示作ؓ(f)输入)。它包含一些{换器以将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(fng):" + ((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消耗时_(d)(x)125 62 187 94 <br /><br />  100k消耗时_(d)(x)704 625 640 766 <br /><br />  1000k消耗时_(d)(x)27984 30750 27859 30656 <br /><br />  10000k消耗时_(d)(x)OutOfMemoryError <br /><br />  最后是DOM4J http://dom4j.sourceforge.net/ <br /><br />  虽然DOM4J代表?jin)完全独立的开发结果,但最初,它是JDOM的一U智能分支。它合ƈ?jin)许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及(qing)用于大文档或化文档的基于事件的处理。它q提供了(jin)构徏文档表示的选项Q它通过DOM4J API和标准DOM接口hq行讉K功能。从2000下半q开始,它就一直处于开发之中?<br /><br />  为支持所有这些功能,DOM4J使用接口和抽象基本类Ҏ(gu)。DOM4J大量使用?jin)API中的Collectionsc,但是在许多情况下Q它q提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是Q虽然DOM4J付出?jin)更复杂的API的代P但是它提供了(jin)比JDOM大得多的灉|性?<br /><br />  在添加灵zL、XPath集成和对大文档处理的目标ӞDOM4J的目标与JDOM是一L(fng)Q针对Java开发者的易用性和直观操作。它q致力于成ؓ(f)比JDOM更完整的解决Ҏ(gu)Q实现在本质上处理所有Java/XML问题的目标。在完成该目标时Q它比JDOM更少防止不正的应用E序行ؓ(f)?<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(fng):" + 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消耗时_(d)(x)109 78 109 31 <br /><br />  100k消耗时_(d)(x)297 359 172 312 <br /><br />  1000k消耗时_(d)(x)2281 2359 2344 2469 <br /><br />  10000k消耗时_(d)(x)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(g)即到来的XML,但ƈ没有载入到内?当然当XML被dӞ?x)有部分文档暂时隐藏在内存??<br /><br />  无疑QDOM4J是这场测试的莯者,目前许多开源项目中大量采用DOM4JQ例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文g。如果不考虑可移植性,那就采用DOM4J吧!(?rosenQ?/td> </tr> </tbody> </table> <img src ="http://www.aygfsteel.com/wangxq/aggbug/38199.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wangxq/" target="_blank">扭{乑֝</a> 2006-03-30 09:58 <a href="http://www.aygfsteel.com/wangxq/articles/38199.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]利用XMLBean轻轻松松dXMLhttp://www.aygfsteel.com/wangxq/articles/38196.html扭{乑֝扭{乑֝Thu, 30 Mar 2006 01:53:00 GMThttp://www.aygfsteel.com/wangxq/articles/38196.htmlhttp://www.aygfsteel.com/wangxq/comments/38196.htmlhttp://www.aygfsteel.com/wangxq/articles/38196.html#Feedback0http://www.aygfsteel.com/wangxq/comments/commentRss/38196.htmlhttp://www.aygfsteel.com/wangxq/services/trackbacks/38196.html版权声明Q本文可以自p{载,转蝲时请务必以超链接形式标明文章原始出处和作者信息及(qing)本声?/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和W(xu)eb Services{技术作为数据交?
因此,正确dXML文档是XML应用的基.
  Java提供?jin)SAX和DOM两种方式用于解析XML,但即便如?要读写一?br />E微复杂的XML,也不是一件容易的?

二、XMLBean?/span>

    Hibernate已经成ؓ(f)目前行的面向Java环境的对?关系数据库映工?
在Hibernate{对?关系数据库映工具出C?Ҏ(gu)据库的操作是
通过JDBC来实现的,Ҏ(gu)据库的Q何操?开发h员都要自己写SQL语句
来实? 对象/关系数据库映工具出现后,Ҏ(gu)据库的操作{成对
JavaBean的操?极大方便?jin)数据库开? 所以如果有一个类似的工具能够
实现对XML的读写{成对JavaBean的操?会(x)化XML的读?即对XML
不熟(zhn)的开发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(fng)数据模型,每个客户都有客户~号(ID),姓名,性别(gender),
?sh)话L(fng)(phoneNumber)和地址,其中地址有两? 首要地址(PrimaryAddress)
和帐单地址(BillingAddress),每个地址有邮~?地址1,和地址2l成.
其中帐单地址q有收g?receiver).

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

<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(fng)使用步骤一?
在正式用XMLBean?我们要作两个准备.

    1. 生成XML Schema文g

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

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

       怎样产生q个Schema文g? 如果对于熟?zhn)XML的开发h?可以自己?br />       写这个Schema文g,对于不熟(zhn)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(h)行的意思是告诉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 />    


       好了(jin),到此我们所有的准备工作已经完成? 下面开始进入重点:(x)利用刚才生成的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(fng)一下的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行之后,我们会(x)看到客户~号?的客L(fng)lastname已经改ؓ(f)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行,我们会(x)看到客户~号?的客L(fng)资料已经被删?

?ji)、查询XML

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



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


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


扭{乑֝ 2006-03-30 09:53 发表评论
]]>
վ֩ģ壺 | | | ˮ| ʯ| ˳| ָ| | SHOW| ˳| ɽ| | ʡ| | | | ȫ| ¬| ԭ| ¡| | ˮ| ¹Ȫ| ٰ| | | | | ƽ½| Ĵʡ| | | ¤| ̫| ζ| ϵ| | | | | ˮ|