??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲午夜国产精品无码,亚洲片一区二区三区,国产av无码专区亚洲av果冻传媒http://www.tkk7.com/yglwxl/category/24752.htmlzh-cnThu, 09 Aug 2007 11:45:58 GMTThu, 09 Aug 2007 11:45:58 GMT60 关于SAXQDOMQJAXPQJDOMQDOM4J的一些理?http://www.tkk7.com/yglwxl/archive/2007/08/09/135481.html?ji)?/dc:creator>?ji)?/author>Thu, 09 Aug 2007 06:02:00 GMThttp://www.tkk7.com/yglwxl/archive/2007/08/09/135481.htmlhttp://www.tkk7.com/yglwxl/comments/135481.htmlhttp://www.tkk7.com/yglwxl/archive/2007/08/09/135481.html#Feedback0http://www.tkk7.com/yglwxl/comments/commentRss/135481.htmlhttp://www.tkk7.com/yglwxl/services/trackbacks/135481.htmlW一Q首先介l一下SAXQDOMQJAXPQJDOMQDOM4J的基本知识:
1、sax、dom是两U对xml文q行分析的方法(没有具体的实玎ͼ只有接口Q?br>所以不是解释器Q如果光有他们,你是完成不了对xml文档的处理的?br>sax的包是org.xml.sax
dom的包是org.w3c.dom
包的名称很重要,它有助于你理解他们之间的关系?

2、jaxp是apiQ他装了sax\dom两种接口。ƈ在sax\dom的基之上Q作了一套比较简单的api以供开发h员用?br>jaxp的包是javax.xml.parsers
可以看看jaxp的源文gQ它的文件中包含了对sax或者dom的引用(importQ?br>jaxp也不是具体的实现Q他只是一套api。如果你仅仅有jaxp那是无法工作?br>Q其实jaxp只是完成对sax、dom的包装,生成了DocumentBuilderFactory\DocumentBuilder
和SAXParserFactory SAXParser。也是设计模式中的工厂模式Q他的好处就是具体的对象Q?解释器)建立由子cd成)

3、xerces解释器(L地球上最快的xml解释器)
在xerces中对jaxp中定义的SAXParser SAXParserFactory DocumentBuilder DocumentBuilderFactoryq行了承(extendsQ对应SAXParserImpl SAXParserFactoryImpl DocumentBuilderImpl DocumentBuilderFactoryImpl
q就是ؓ什么你的classpath中只要有xerces.jarQ其中包含了sax dom jaxp Q和 xercesImpl.jar可以的原因?

4、什么时候可以用别的解释?比如crimson?br>他也是和xerces一?是解释器Q很单,用crimson.jar 替代xercesImpl.jar

5、jdom和dom4j
W3C的DOM标准API隄的让人想撞墙Q于是有一帮h开发Java专用的XML API目的是ؓ了便于用,q就是jdom的由来,开发到一半的时候,另一部分人又分了出来Q他们有自己的想法,于是他们去开发dom4jQŞ成了今天q样两个APIQ至于他们之间的性能Qjdom全面惨|Qdom4j大获全胜。我觉得jdom和dom4jq当于sax/dom+jaxpQ具体的解释器可以选择?

W二Q再介绍一下,dom,sax,jdom,dom4j的技术特点:

1: DOM
DOM 是用与^台和语言无关的方式表C?XML 文的官?W3C 标准。DOM 是以层次l构l织的节Ҏ(gu)信息片断的集合。这个层ơ结构允许开发h员在树中L特定信息。分析该l构通常需要加载整个文档和构造层ơ结构,然后才能做Q何工作。由于它是基于信息层ơ的Q因?DOM 被认为是Z树或Z对象的。DOM 以及q义的基于树的处理具有几个优炏V首先,׃树在内存中是持久的,因此可以修改它以便应用程序能Ҏ(gu)据和l构作出更改。它q可以在M时候在树中上下DQ而不是像 SAX 那样是一ơ性的处理。DOM 使用h也要单得多?br>  另一斚wQ对于特别大的文,解析和加载整个文可能很慢且很耗资源,因此使用其他手段来处理这L数据会更好。这些基于事件的模型Q比?SAX?

2:SAX
  q种处理的优炚w常类g媒体的优点。分析能够立卛_始,而不是等待所有的数据被处理。而且Q由于应用程序只是在d数据时检查数据,因此不需要将数据存储在内存中。这对于大型文来说是个巨大的优炏V事实上Q应用程序甚至不必解析整个文;它可以在某个条g得到满时停止解析。一般来_SAX q比它的替代?DOM 快许多?

3: 选择 DOM q是选择 SAX Q?br>  对于需要自q写代码来处理 XML 文档的开发h员来_选择 DOM q是 SAX 解析模型是一个非帔R要的设计决策?
  DOM 采用建立树Şl构的方式访?XML 文Q?SAX 采用的事件模型?
  DOM 解析器把 XML 文转化Z个包含其内容的树Qƈ可以Ҏ(gu)q行遍历。用 DOM 解析模型的优Ҏ(gu)~程Ҏ(gu)Q开发h员只需要调用徏树的指oQ然后利用navigation APIs讉K所需的树节点来完成Q务。可以很Ҏ(gu)的添加和修改树中的元素。然而由于?DOM 解析器的时候需要处理整?XML 文Q所以对性能和内存的要求比较高,其是遇到很大的 XML 文g的时候。由于它的遍历能力,DOM 解析器常用于 XML 文需要频J的改变的服务中?
  SAX 解析器采用了Z事g的模型,它在解析 XML 文档的时候可以触发一pd的事Ӟ当发现给定的tag的时候,它可以激zM个回调方法,告诉该方法制定的标签已经扑ֈ。SAX 对内存的要求通常会比较低Q因为它让开发h员自己来军_所要处理的tag。特别是当开发h员只需要处理文中所包含的部分数据时QSAX q种扩展能力得到了更好的体现。但?SAX 解析器的时候编码工作会比较困难Q而且很难同时讉K同一个文档中的多处不同数据?

4:jdom http://www.jdom.org
JDOM 的目的是成ؓ Java 特定文模型Q它化与 XML 的交互ƈ且比使用 DOM 实现更快。由于是W一?Java 特定模型QJDOM 一直得到大力推q和促进。正在考虑通过“Java 规范h JSR-102”它最l用?#8220;Java 标准扩展”。从 2000 q初已l开始了 JDOM 开发?br>  JDOM ?DOM 主要有两斚w不同。首先,JDOM 仅用具体类而不使用接口。这在某些方面简化了 APIQ但是也限制了灵zL。第二,API 大量使用?Collections c,化了那些已经熟?zhn)q些cȝ Java 开发者的使用?br>  JDOM 文声明其目的是“使用 20%Q或更少Q的_֊解决 80%Q或更多QJava/XML 问题”Q根据学习曲U假定ؓ 20%Q。JDOM 对于大多?Java/XML 应用E序来说当然是有用的Qƈ且大多数开发者发?API ?DOM Ҏ(gu)理解得多。JDOM q包括对E序行ؓ的相当广泛检查以防止用户做Q何在 XML 中无意义的事。然而,它仍需要?zhn)充分理?XML 以便做一些超出基本的工作Q或者甚至理解某些情况下的错误)。这也许是比学习 DOM ?JDOM 接口都更有意义的工作?br>  JDOM 自n不包含解析器。它通常使用 SAX2 解析器来解析和验证输?XML 文Q尽它q可以将以前构造的 DOM 表示作ؓ输入Q。它包含一些{换器以将 JDOM 表示输出?SAX2 事g、DOM 模型?XML 文本文。JDOM 是在 Apache 许可证变体下发布的开放源码?

5: DOM4J   http://dom4j.sourceforge.net/
 虽然 DOM4J 代表了完全独立的开发结果,但最初,它是 JDOM 的一U智能分支。它合ƈ了许多超出基?XML 文表示的功能,包括集成?XPath 支持、XML Schema 支持以及用于大文或化文的基于事件的处理。它q提供了构徏文档表示的选项Q它通过 DOM4J API 和标?DOM 接口hq行讉K功能。从 2000 下半q开始,它就一直处于开发之中?br>  为支持所有这些功能,DOM4J 使用接口和抽象基本类Ҏ(gu)。DOM4J 大量使用?API 中的 Collections c,但是在许多情况下Q它q提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是Q虽?DOM4J 付出了更复杂?API 的代P但是它提供了?JDOM 大得多的灉|性?br>  在添加灵zL、XPath 集成和对大文处理的目标ӞDOM4J 的目标与 JDOM 是一LQ针?Java 开发者的易用性和直观操作。它q致力于成ؓ?JDOM 更完整的解决Ҏ(gu)Q实现在本质上处理所?Java/XML 问题的目标。在完成该目标时Q它?JDOM 更少防止不正的应用E序行ؓ?br>  DOM4J 是一个非帔R怼U的Java XML APIQ具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的Y件。如今你可以看到来多?Java 软g都在使用 DOM4J 来读?XMLQ特别值得一提的是连 Sun ?JAXM 也在?DOM4J?

最后:我徏议用dom4j

 JDOM ?DOM 在性能试时表C佻I在测?10M 文时内存溢出。在文情况下q值得考虑使用 DOM ?JDOM。虽?JDOM 的开发者已l说明他们期望在正式发行版前专注性能问题Q但是从性能观点来看Q它实没有值得推荐之处。另外,DOM 仍是一个非常好的选择。DOM 实现q泛应用于多U编E语a。它q是许多其它?XML 相关的标准的基础Q因为它正式获得 W3C 推荐Q与Z非标准的 Java 模型相对Q,所以在某些cd的项目中可能也需要它Q如?javascript 中?DOMQ?br>  SAX表现较好Q这要依赖于它特定的解析方式。一?SAX 即到来的XML,但ƈ没有载入到内存(当然当XML被dӞ会有部分文档暂时隐藏在内存中Q?br>  无疑QDOM4J是最好的Q目前许多开源项目中大量采用 DOM4JQ例如大名鼎鼎的 Hibernate 也用 DOM4J 来读?XML 配置文g。如果不考虑可移植性,那就采用DOM4J吧!

四种xml操作方式的基本用方?

Q?/span>?xml version="1.0" encoding="GB2312"?Q?/span>
Q?/span>RESULTQ?/span>

Q?/span>VALUEQ?/span>

   Q?/span>NOQ?/span>苏A88888Q?/span>/NOQ?/span>

   Q?/span>ADDRQ南京市新街?0?/span>Q?/span>/ADDRQ?/span>

Q?/span>/VALUEQ?/span>

Q?/span>VALUEQ?/span>

   Q?/span>NOQ?/span>苏A99999Q?/span>/NOQ?/span>

   Q?/span>ADDRQ南京市p?0?/span>Q?/span>/ADDRQ?/span>

Q?/span>/VALUEQ?/span>

Q?/span>/RESULTQ?/span>


1
Q?/span>
DOM

import java.io.*;
import java.util.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;

public class MyXMLReader{
 
public static void main(String arge[]){

  
long lasting =System.currentTimeMillis();
  
try{
   
File f=new File("data_10k.xml");
   
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
   
DocumentBuilder builder=factory.newDocumentBuilder();
   
Document doc = builder.parse(f);
   
NodeList nl = doc.getElementsByTagName("VALUE");
   for (int i=0;iQ?/span>
nl.getLength();i++){
    System.out.print("车牌L
:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());
    System.out.println("车主地址
:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());
   
}
  
}catch(Exception e){
   
e.printStackTrace();
}

2
Q?/span>
SAX

import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;

public class MyXMLReader extends DefaultHandler {

 
java.util.Stack tags = new java.util.Stack();
 
public MyXMLReader() {
  
super();
}

 
public static void main(String args[]) {
  
long lasting = System.currentTimeMillis();
  
try {
   
SAXParserFactory sf = SAXParserFactory.newInstance();
   
SAXParser sp = sf.newSAXParser();
   
MyXMLReader reader = new MyXMLReader();
   
sp.parse(new InputSource("data_10k.xml"), reader);
  
} catch (Exception e) {
   
e.printStackTrace();
  
}

  System.out.println("q行旉Q?/span>" + (System.currentTimeMillis() - lasting) + "毫秒
");}
  
public void characters(char ch[], int start, int length) throws SAXException {
  
String tag = (String) tags.peek();
  
if (tag.equals("NO")) {
   System.out.print("车牌LQ?/span>
" + new String(ch, start, length));
}
if (tag.equals("ADDR")) {
  System.out.println("地址
:" + new String(ch, start, length));
}
}

  
public void startElement(String uri,String localName,String qName,Attributes attrs) {
  
tags.push(qName);}
}

3
Q?/span>
JDOM

import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;

public class MyXMLReader {

 
public static void main(String arge[]) {
  
long lasting = System.currentTimeMillis();
  
try {
   
SAXBuilder builder = new SAXBuilder();
   
Document doc = builder.build(new File("data_10k.xml"));
   
Element foo = doc.getRootElement();
   
List allChildren = foo.getChildren();
   for(int i=0;iQ?/span>
allChildren.size();i++) {
    System.out.print("车牌L
:" + ((Element)allChildren.get(i)).getChild("NO").getText());
    System.out.println("车主地址
:" + ((Element)allChildren.get(i)).getChild("ADDR").getText());
   
}
  
} catch (Exception e) {
   
e.printStackTrace();
}

}

4
Q?/span>
DOM4J

import java.io.*;
import java.util.*;
import org.dom4j.*;
import org.dom4j.io.*;

public class MyXMLReader {

 
public static void main(String arge[]) {
  
long lasting = System.currentTimeMillis();
  
try {
   
File f = new File("data_10k.xml");
   
SAXReader reader = new SAXReader();
   
Document doc = reader.read(f);
   
Element root = doc.getRootElement();
   
Element foo;
   
for (Iterator i = root.elementIterator("VALUE"); i.hasNext() {
    
foo = (Element) i.next();
    System.out.print("车牌L
:" + foo.elementText("NO"));
    System.out.println("车主地址
:" + foo.elementText("ADDR"));
   
}
  
} catch (Exception e) {
   
e.printStackTrace();
}
)



]]>
DOM教程Q什么是DOMQ?----来源QIBM developerWorkshttp://www.tkk7.com/yglwxl/archive/2007/08/09/135447.html?ji)?/dc:creator>?ji)?/author>Thu, 09 Aug 2007 04:55:00 GMThttp://www.tkk7.com/yglwxl/archive/2007/08/09/135447.htmlhttp://www.tkk7.com/yglwxl/comments/135447.htmlhttp://www.tkk7.com/yglwxl/archive/2007/08/09/135447.html#Feedback0http://www.tkk7.com/yglwxl/comments/commentRss/135447.htmlhttp://www.tkk7.com/yglwxl/services/trackbacks/135447.htmlDOM教程Q什么是DOMQ?br>                        作ؓl构?nbsp;DOM
      DOM是以层次l构l织的节Ҏ(gu)信息片断的集合。这个层ơ结构允许开发h员在树中D仪寻扄定信息。分析该l构通常需要加载整个文档和构造层ơ结构,然后才能做Q何工作。由于它是基于信息层ơ的Q因?nbsp;DOM 被认为是Z树或Z对象的?br>      对于特别大的文档Q解析和加蝲整个文档可能很慢且很耗资源,因此使用其他手段来处理这L数据会更好。这些基于事件的模型Q比?nbsp;Simple API for XMLQSAXQ,适用于处理数据流Q即随着数据的流动而依ơ处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发h员实际更改原始文档中的数据?br>     另一斚wQDOM q提供了一?nbsp;APIQ允许开发h员添加、编辑、移动或删除树中L位置的节点,从而创Z个引用程序?br>     解析器是一个Y件应用程序,设计用于分析文档Q这里是?nbsp;XML 文gQ,以及做一些特定于该信息的事情。在诸如 SAX q样Z事g?nbsp;API 中,解析器将向某U监听器发送事件。在诸如 DOM q样Z树的 API 中,解析器将在内存中构造一颗数据树?br>作ؓ API ?nbsp;DOM
     ?nbsp;DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它q包含用这些对象所必需的方法和属性?br>Level 1 包括?nbsp;XML 1.0 ?nbsp;HTML 的支持,每个 HTML 元素被表CZؓ一个接口。它包括用于d、编辑、移动和d节点中包含的信息的方法,{等。然而,它没有包括对 XML 名称I间QXML NamespaceQ的支持QXML 名称I间提供分割文档中的信息的能力?br>     DOM Level 2 d了名U空间支持。Level 2 扩展?nbsp;Level 1Q允许开发h员检和使用可能适用于某个节点的名称I间信息。Level 2 q增加了几个新的模块Q以支持U联样式表、事件和增强的树操作?br>     当前正处于定EKD늚 DOM Level 3 包括对创?nbsp;Document 对象Q以前的版本这个Q务留l实玎ͼ使得创徏通用应用E序很困难)的更好支持、增强的名称I间支持Q以及用来处理文档加载和保存、验证以?nbsp;XPath 的新模块QXPath 是在 XSL 转换QXSL TransformationQ以及其?nbsp;XML 技术中用来选择节点的手Dc?br>     DOM 的模块化意味着作ؓ开发h员,(zhn)必ȝ道自己希望用的Ҏ(gu)是否受正在使用?nbsp;DOM 实现所支持?br>                                        定Ҏ(gu)可用?br>     DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分Q因而在使用某个特定的特性之前,首先定该特性是否可用可能是必要的。本教程仅?nbsp;DOM Level 2 Core APIQ不q在着手?zhn)自己的项目时Q了解如何能够检特性是有所帮助的?br>     DOM 中定义的接口之一是 DOMImplementation。通过使用 hasFeature() Ҏ(gu)Q?zhn)可以定某个特定的特性是否受支持。DOM Level 2 中不存在创徏DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确?nbsp;DOM Level 2 样式表模块在某个 Java 应用E序中是否受支持?br>import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.DOMImplementation;
public class ShowDomImpl {
   public static void main (String args[]) {
      try {
         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
         DocumentBuilder docb = dbf.newDocumentBuilder();
         DOMImplementation domImpl = docb.getDOMImplementation();
         if (domImpl.hasFeature("StyleSheets", "2.0")) {
            System.out.println("Style Sheets are supported.");
         } else {
            System.out.println("Style Sheets are not supported.");
         }
      } catch (Exception e) {}      
 }
}
QDOM Level 3 包括用于创?nbsp;DOMImplementation 的标准方法。)
     本教E将使用单个文来展C?nbsp;DOM Level 2 Core API 的对象和Ҏ(gu)?br>                                        基本?nbsp;XML 文g
     本教E中的所有例子都是用了一个包含如下节点的 XML 文gQ它表示输入某个商业pȝ的订单。回一下,XML 文g的基本组成部分包括:
     XML 声明Q?/strong>基本的声?nbsp;<?xml version"1.0"?> 这个文件定义ؓ XML 文档。在声明中指定一U字W编码的情况q不鲜见Q如下所C。通过q种方式Q不该 XML 文g使用的语a或字W编码是什么,只要解析器理解特定的~码Q它?yu)p够正地d?nbsp;XML 文g?nbsp;
     DOCTYPE 声明Q?/strong>XML 是hZ间交换信息的便利手段Q但是要使它能够利地工作,必须要有一个公q词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中?nbsp;orders.dtdQ,以确保不会生Q何؜淆或丢失信息Q例如,丢失一?nbsp;userid 或错误拼写某个元素名Uͼ。以q种方式处理q的文UCؓ有效的文。成功的有效性检查ƈ不是 XML 所必需的,后面的例子实际上从文中省略?nbsp;DOCTYPE 声明?nbsp;
     数据本nQ?/strong>XML 文中的数据必须包含在单个根元素内,比如下面?nbsp;orders 元素。要?nbsp;XML 文档得到处理Q它必须是格式良好的Qwell-formedQ?nbsp;
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ORDERS SYSTEM "orders.dtd">
<orders>
   <order>
      <customerid limit="1000">12341</customerid>
      <status>pending</status>
      <item instock="Y" itemid="SA15">
         <name>Silver Show Saddle, 16 inch</name>
         <price>825.00</price>
         <qty>1</qty>
      </item>
      <item instock="N" itemid="C49">
         <name>Premium Cinch</name>
         <price>49.00</price>
         <qty>1</qty>
      </item>
   </order>
   <order>
      <customerid limit="150">251222</customerid>
      <status>pending</status>
      <item instock="Y" itemid="WB78">
         <name>Winter Blanket (78 inch)</name>
         <price>20</price>
         <qty>10</qty>
      </item>
   </order>
</orders>
    ?nbsp;DOM 中,使用 XML 信息意味着首先它划分炏V?/p>

]]>
վ֩ģ壺 һͼƬ| þþƷž޾Ʒ| ޳AƬ߲| 99reƵ| þþþAVվ | ߳aëƬѲ| ˾Ʒ2020| Ʒþþþù| ޷A߷| ղƵ߹ۿ| ëƬ쿴| ޳?߹ۿ| һaƬþëƬѿ| ҹľƷ| ĻƬ| þþƷ69Ʒ| 㽶һ| ޸һ| ůůѸձһ| ɫëƬѹۿ| ȸAV߲| 99ֻоƷƵѿ| ޾Ʒ˾þ| һ| aëƬƵ| ޸һ| Ʒ鶹վ| ɫַ߹ۿ| ޾Ʒ| ձ˳ɻҳۿƵ | һëƬaaaaaaƵѿ| þþƷav| ëƬѹۿƵ| һëƬѲԿ60| | պƵ| ӰƬһѹۿ| ޾Ʒһۺ99þ| ۺ| ŷƵ| 4huĻӰԺwww|