??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲香蕉av在线一区二区三区 ,激情不卡一区二区三区视频在线,日本一区二区三区精品视频http://www.aygfsteel.com/caizh2009/category/44321.html与大家共同成?/description>zh-cnThu, 18 Mar 2010 17:26:07 GMTThu, 18 Mar 2010 17:26:07 GMT60SAX解析XML例子http://www.aygfsteel.com/caizh2009/archive/2010/03/17/315699.html菜毛毛菜毛毛Wed, 17 Mar 2010 09:37:00 GMThttp://www.aygfsteel.com/caizh2009/archive/2010/03/17/315699.htmlhttp://www.aygfsteel.com/caizh2009/comments/315699.htmlhttp://www.aygfsteel.com/caizh2009/archive/2010/03/17/315699.html#Feedback0http://www.aygfsteel.com/caizh2009/comments/commentRss/315699.htmlhttp://www.aygfsteel.com/caizh2009/services/trackbacks/315699.html用SAX解析xml文g的例?/div>
2008-07-15 09:46
1Q?Xml技术简?br /> Xml文g有两U约束类型,包括文cd定义QDTDQ和Xml 模式QSchemaQ。Xml DTD被包含在xml1的标准里。Xml 模式被包含在W3C的标准中。在xml 数据和xml 模式两者之间有很多的区别?br /> AQ?xml模式支持的数据类型比xml DTD多;
BQ?xml模式在无序的情况下用v来比xml DTD更方便;
CQ?xml模式支持名字I间Q可以在不同的文件中定义相同的方法等?br /> DQ?xml模式形成的文档可以被多种标准解析Q如domQsax或者jdom{,而xml DTD方式下确不行?br /> 2Q?Xml文g解析
在java语言环境里可以用三U方法解析xml文gQdomQdocument object modelQ,saxQsimple api for xmlQ和jdomQjava document object modelQ?br /> SAX提供了基于事件的方式q行解析Q适合于快速,数据量小的解析情cSAX解析有几个缺PA.它的解析是连l的QB.数据无法回朔?br /> DOM解析不同于SAX。它提供了内存中完整的xml数据映像Q数据被存储在树状结构中。DOM解析方式更容易获得和处理数据?br /> JDOM是java语言中特有的Q主要用来支持xpath标准?br /> 3Q?SAX解析方式
上面我简要介l了几种解析xml文g的技术,q里我们使用SAX技术给Z个小例子Q大家可以从q个例子中发现如果你能够掌握一些开源Y件包Q你可以很 快掌握解析xml数据的技术?br /> 3Q?制作一个简单的xml文gcomponent.xml
<?xml version="1.0"?>
<XmlComponents>
<XmlComponent>
<ComNo>1</ComNo>
</XmlComponent>
</XmlComponents>

3.2下蝲xerces.jar软g?/strong>
在Apache|站?#215;××下蝲xerces.jar软g包,q个包中包含了上面我们列丄几种解析xml数据的API。然后将q个软g包加入到E序? classpath中?br /> 3.3制作解析cMySaxParser.java
import java.io.IOException;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;

public class MySaxParser extends DefaultHandler {
private static int INDENT = 2;

// q行L?br /> public static void main(String[] argv) {
// if (argv.length != 1) {
// System.out.println("Usage: java ds.MySaxParser [URI]");
// System.exit(0);
// }
System.setProperty("javax.xml.parsers.SAXParserFactory", "org.apache.xerces.jaxp.SAXParserFactoryImpl");
// String uri = argv[0];
String uri = "Components.xml";
try {
SAXParserFactory parserFactory = SAXParserFactory.newInstance();
parserFactory.setValidating(false);
parserFactory.setNamespaceAware(false);
MySaxParser MySaxParserInstance = new MySaxParser();
SAXParser parser = parserFactory.newSAXParser();
parser.parse(uri, MySaxParserInstance);
}
catch(IOException ex) {
ex.printStackTrace();
}
catch(SAXException ex) {
ex.printStackTrace();
}
catch(ParserConfigurationException ex) {
ex.printStackTrace();
}
catch(FactoryConfigurationError ex) {
ex.printStackTrace();
}

}

private int idx = 0; //indent
// 处理各种分隔W号
public void characters(char[] ch, int start, int length) throws SAXException {
//instantiates s, indents output, prints character values in element
String s = new String(ch, start, length);
if (!s.startsWith("\n")) //I的value不打?br /> System.out.println(getIndent()+ " Value: " + s);
}

// 处理文?br /> public void endDocument() throws SAXException {
idx -= INDENT;
System.out.println(getIndent() + "end document");

System.out.println("...PARSING ends");
}

// 处理标记?br /> public void endElement(String uri, String localName, String qName) throws SAXException {
idx -= INDENT;
}

// 处理文的v始点
public void startDocument() throws SAXException {
idx += INDENT;
System.out.println("PARSING begins...");
System.out.println(getIndent() + "start document: ");
}

// 处理标记?br /> public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
idx += INDENT;
System.out.println('\n' + getIndent() + "start element: " + qName);

}

private String getIndent() {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < idx; i++)
sb.append(" ");
return sb.toString();
}

}


ȝQ虽然解析xml数据很复杂,因ؓ涉及了很多的递归法Q但是我们可以用业界比较成熟的解析API来进行xml数据处理。我现在只是l出了一个非? 单的例子Q但是在真实pȝ中远比这个要复杂的多Q大家以后在使用的用会发现q是有很多的工作要做的?/div>

菜毛毛 2010-03-17 17:37 发表评论
]]>使用SAX解析XMLhttp://www.aygfsteel.com/caizh2009/archive/2010/03/17/315690.html菜毛毛菜毛毛Wed, 17 Mar 2010 08:20:00 GMThttp://www.aygfsteel.com/caizh2009/archive/2010/03/17/315690.htmlhttp://www.aygfsteel.com/caizh2009/comments/315690.htmlhttp://www.aygfsteel.com/caizh2009/archive/2010/03/17/315690.html#Feedback0http://www.aygfsteel.com/caizh2009/comments/commentRss/315690.htmlhttp://www.aygfsteel.com/caizh2009/services/trackbacks/315690.html一?nbsp;       前言

? Java解析XML文Q最常用的有两种ҎQ用基于事件的XML单APIQSimple API for XMLQ称为SAX和基于树和节点的文对象模型QDocument Object ModuleQ称为DOM。Sun公司提供了Java API for XML ParsingQJAXPQ接口来使用SAX和DOMQ通过JAXPQ我们可以用Q何与JAXP兼容的XML解析器?/p>

JAXP接口包含了三个包Q?/p>

Q?Q?nbsp;      org.w3c.dom  W3C推荐的用于XML标准规划文档对象模型的接口?/p>

Q?Q?nbsp;      org.xml.sax   用于对XMLq行语法分析的事仉动的XML单APIQSAXQ?/p>

Q?Q?nbsp;      javax.xml.parsers解析器工厂工PE序员获得ƈ配置Ҏ的特D语法分析器?/p>

二?nbsp;       前提

DOM~程不要其它的依赖包Q因为JDK里自带的JDK里含有的上面提到的org.w3c.dom、org.xml.sax 和javax.xml.parsers包就可以满意条g了?/p>

三?nbsp;       使用SAX解析XML文

SAX是基于事件的单APIQ同L我们也是用一个最单的例子来看看SAX是如何解析XML?/p>

先来看看我们要解析的XML代码?/p>

<?xml version="1.0" encoding="gb2312"?>

<books>

  <book email="zhoujunhui">

             <name addr="address">rjzjh</name>

             <price>jjjjjj</price>

  </book>

</books>

单的不能再简单了。但是该有的都有了,根元素、属性、子节点。好了,能反应问题就行了Q下面来看看解析q个XML文g的Java代码吧!

1 public class SaxParse {

2     public SaxParse(){

3            SAXParserFactory saxfac=SAXParserFactory.newInstance();

4            try {

5                   SAXParser saxparser=saxfac.newSAXParser();

6                   InputStream is=new FileInputStream("bin/library.xml");

7                   saxparser.parse(is,new MySAXHandler());

8            } catch (ParserConfigurationException e) {

9                   e.printStackTrace();

10           } catch (SAXException e) {

11                  e.printStackTrace();

12           } catch (FileNotFoundException e) {

13                  e.printStackTrace();

14           } catch (IOException e) {

15                  e.printStackTrace();

16           }

17    }

18    public static void main(String[] args) {

19           new SaxParse();

20    }

21  }

q段代码比较短,因ؓSAX是事仉动的Q它的大部分实现在在另一个Java文g中,先别另一个文Ӟ我们来一个个地分析吧Q?/p>

Q?Q得到SAX解析器的工厂实例

3            SAXParserFactory saxfac=SAXParserFactory.newInstance();

q是一个javax.xml.parsers.SAXParserFactorycȝ实例

Q?Q从SAX工厂实例中获得SAX解析?/p>

5            SAXParser saxparser=saxfac.newSAXParser();

使用javax.xml.parsers.SAXParserFactory工厂的newSAXParser()Ҏ

Q?Q把要解析的XML文档转化入流Q以便DOM解析器解析它

6                   InputStream is=new FileInputStream("bin/library.xml");

InputStream是一个接口?/p>

Q?Q解析XML文

7                   saxparser.parse(is,new MySAXHandler());

后面׃用看了,都是些没用的代码Q相对而言Q,够简单的吧!

注意了,我们新徏了一个实例new MySAXHandler()q个实例里面又有什么东西呢Q?/p>

q个实例是SAX的精华所在。我们用SAX解析器时Q必d现内容处理器ContentHandler接口中的一些回调方法,然而我们不要全部地实现这些方法,q好Q我们有org.xml.sax.helpers.DefaultHandlerc,看它的类xQ?/p>

public class DefaultHandler

implements EntityResolver, DTDHandler, ContentHandler, ErrorHandler

实现了这么多接口啊,其它的先不管了,臛_它实CContentHandlerq一接口?/p>

好了Q看看这个类有些什么吧Q下面是它的Java代码Q?/p>

public class MySAXHandler extends DefaultHandler {

       boolean hasAttribute=false;

       Attributes attributes=null;

       /* Q非 JavadocQ?/p>

        * @see org.xml.sax.helpers.DefaultHandler#startDocument()

        */

       public void startDocument() throws SAXException {

               System.out.println("文开始打C");

       }

       /* Q非 JavadocQ?/p>

        * @see org.xml.sax.helpers.DefaultHandler#endDocument()

        */

       public void endDocument() throws SAXException {

              System.out.println("文打印l束?);

       }

       /* Q非 JavadocQ?/p>

        * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)

        */

       public void startElement(String uri, String localName, String qName,

                     Attributes attributes) throws SAXException {

              if(qName.equals("books")){

                     return;

              }

              if(qName.equals("book")){

                     System.out.println(attributes.getQName(0)+attributes.getValue(0));

              }

              if(attributes.getLength()>0){

                     this.attributes=attributes;

                     this.hasAttribute=true;

              }

       }

       /* Q非 JavadocQ?/p>

        * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)

        */

       public void endElement(String uri, String localName, String qName)

                     throws SAXException {

              if(hasAttribute&&(attributes!=null)){

                     for(int i=0;i<attributes.getLength();i++){

                            System.out.println(attributes.getQName(0)+attributes.getValue(0));

                     }

              }

       }

       /* Q非 JavadocQ?/p>

        * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)

        */

       public void characters(char[] ch, int start, int length)

                     throws SAXException {

              System.out.println(new String(ch,start,length));

       }

 

 

}

不要看它一大堆Q我一一分解l大家看。我们说SAX是基于事件的APIQ我们这个类实到了ContentHandler接口中的如下ҎQ?/p>

Q?QstartDocument()  用于处理文解析开始事?/p>

     public void startDocument() throws SAXException {

               System.out.println("文开始打C");

        }

Q?QendDocument()  用于处理文档解析l束事g

      public void endDocument() throws SAXException {

              System.out.println("文打印l束?);

        }

Q?QstartElement  用于处理元素开始事?/p>

     public void startElement(String uri, String localName, String qName,

                     Attributes attributes) throws SAXException {

              if(qName.equals("books")){

                     return;

              }

              if(qName.equals("book")){

                     System.out.println(attributes.getQName(0)+attributes.getValue(0));

              }

              if(attributes.getLength()>0){

                     this.attributes=attributes;

                     this.hasAttribute=true;

              }

       }

W二个参数String qName表示q个元素的名字,如:

根节?<books></books> 它的qName?#8220;books”

最底层节点 <price>jjjjjj</price> 它的qName?#8220;price”

知道q一点上面程序就好解释了Q当遇到根元?#8220;books”时就什么也不做跌Q当遇到“book”元素时就打出它的属性(它只有一个属?lt;book email="zhoujunhui"></book>Q?/p>

当是其它节点Ӟq下只剩下最底层的两个节?#8220;name”?#8220;price”了)Q就把它的属性取出来存到this.attributes域中Q以后中元素l束事g好处理?/p>

Q?QendElement 用于处理元素l束事g

     public void endElement(String uri, String localName, String qName)

                     throws SAXException {

              if(hasAttribute&&(attributes!=null)){

                     for(int i=0;i<attributes.getLength();i++){

                            System.out.println(attributes.getQName(0)+attributes.getValue(0));

                     }

              }

       }

代码的作用是如果q个元素的属性不为空QhasAttribute&&(attributes!=null)Q,把它们打印出来?/p>

Q?Qcharacters(char[] ch, int start, int length) 处理元素字符的内?/p>

              public void characters(char[] ch, int start, int length)

                     throws SAXException {

              System.out.println(new String(ch,start,length));

       }

我们只用了这么几个事Ӟ其它q有其的的一些事Ӟ我们只要看一下ContentHandlerq个接口p了,如:

Q?QstartPrefixMapping(String prefix,String URI) 处理前缀映射开始事Ӟ参数表示前缀名称和所指向的URI

Q?QendPrefixMapping(String prefix,String URI) 处理前缀映射l束事gQ参数表C前~名称和所指向的URI

Q?QignorableWhitespace(Char[] ch,int start,int length) 处理元素中可忽略的空?/p>

Q?QprocessingInstruction(String target,String data) 处理解析中生的处理指o事g?/p>

菜毛毛 2010-03-17 16:20 发表评论
]]>
XML的接口标准DOM与SAX的区?/title><link>http://www.aygfsteel.com/caizh2009/archive/2010/03/17/315682.html</link><dc:creator>菜毛毛</dc:creator><author>菜毛毛</author><pubDate>Wed, 17 Mar 2010 07:42:00 GMT</pubDate><guid>http://www.aygfsteel.com/caizh2009/archive/2010/03/17/315682.html</guid><wfw:comment>http://www.aygfsteel.com/caizh2009/comments/315682.html</wfw:comment><comments>http://www.aygfsteel.com/caizh2009/archive/2010/03/17/315682.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/caizh2009/comments/commentRss/315682.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/caizh2009/services/trackbacks/315682.html</trackback:ping><description><![CDATA[当你需要处理XML文Ӟ你的首要选择是用DOM(文档对象模型)q是使用SAX(用于XML的简单API)Q即当前使用的两个主要的XML API。你可以使用M一U?或者在同一旉使用两种)来处理XML文Q然而DOM文蝲入到内存中处理,而SAX则相反,它可以检一个即到来的 XML,由此q不需要所有的XML代码同时载入到内存中?br /> 选择DOM与SAXQ与在一个数据库中的表单与视图之前选择一P选择适合于当前实际情늚Ҏ。如果你只是想简单地查看XML文档而不处理它,那么请选择使用SAX? <p><br /> SAX与DOM之间有一些显著区别,包括Q?br />          DOM是复杂对象处理的首选,比如当XML比较复杂的时候,或者当你需要随机处理文中数据的时候。SAX从文的开始通过每一节点UdQ以定位一个特定的节点?<br /> DOM 入到内存的文节点徏立类型描q。最l,q些描述呈现了可Ҏ横向Ud、潜在巨大、树型结构。如果XML很冗长,DOM׃昄出无法控制的胀大。例 如,一?00KB的XML文可以DRAM或者虚拟内存中?Q?00Q?00KB的DOM树型l构。通过比较׃发现Q一个SAX文档Ҏ没有被 解构Q它也没有隐藏在内存I间?当然当XML被dӞ会有部分文暂时隐藏在内存中)。SAX是一U?#8220;更轻巧的”技术──它可以给你的pȝ带来? ȝ负担。SAX相当于观看一场马拉松比赛Q而DOM好比邀h有的比赛选手到家里参加晚?br /> 所以,你如何选择SAX和DOMQ如果你处理复杂的东西,比如高XSLT转换Q或者XpathqoQ请选择使用DOM。如果你建立或者更改XML文Q你也可以选择DOM?br /> 相反Q你可以使用SAX来查询或者阅读XML文。SAX可以快速扫描一个大型的XML文Q当它找到查询标准时׃立即停止Q然后再处理之?br /> 在某些情况下Q在一个方案中Q最佳的选择是用DOM和SAX处理不同的部分。例如,你可以用DOMXML载入到内存ƈ改变它,然后通过从DOM树中发送一个SAX而{UL后的l果?/p> <p><br /> SAX概念</p> <p>   SAX是Simple API for XML的羃写,它ƈ不是由W3C官方所提出的标准,可以说是“民间”的事实标准。实际上Q它是一U社区性质的讨Z物。虽然如此,在XML中对SAX的应用丝毫不比DOM,几乎所有的XML解析器都会支持它?/p> <p>与DOM比较而言QSAX是一U轻量型的方法。我们知道,在处理DOM的时候,我们需要读入整个的XML文Q然后在内存中创建DOM树,生成 DOM树上的每个Node对象。当文档比较的时候,q不会造成什么问题,但是一旦文大hQ处理DOM׃变得相当Ҏ费力。特别是其对于内存的需 求,也将是成倍的增长Q以至于在某些应用中使用DOM是一件很不划的事(比如在applet中)。这时候,一个较好的替代解决Ҏ是SAX?/p> <p>   SAX在概念上与DOM完全不同。首先,不同于DOM的文驱动,它是事g驱动的,也就是说Q它q不需要读入整个文,而文档的dq程也就 是SAX的解析过E。所谓事仉动,是指一U基于回调(callbackQ机制的E序q行Ҏ。(如果你对Java新的代理事g模型比较清楚的话Q就会很 Ҏ理解q种机制了)</p> <p>   在XMLReader接受XML文Q在dXML文的过E中p行解析,也就是说d文的过E和解析的过E是同时q行的,q和DOM? 别很大。解析开始之前,需要向XMLReader注册一个ContentHandlerQ也是相当于一个事件监听器Q在ContentHandler? 定义了很多方法,比如startDocument()Q它定制了当在解析过E中Q遇到文档开始时应该处理的事情。当XMLReaderd合适的内容Q就 会抛出相应的事gQƈ把这个事件的处理权代理给ContentHandlerQ调用其相应的方法进行响?/p> <img src ="http://www.aygfsteel.com/caizh2009/aggbug/315682.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/caizh2009/" target="_blank">菜毛毛</a> 2010-03-17 15:42 <a href="http://www.aygfsteel.com/caizh2009/archive/2010/03/17/315682.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ʯ¥</a>| <a href="http://" target="_blank">ƶ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">Ѯ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">μ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">կ</a>| <a href="http://" target="_blank">Ɽ</a>| <a href="http://" target="_blank">ϰˮ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ȫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ҫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">³</a>| <a href="http://" target="_blank">麣</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʯ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʡ</a>| <a href="http://" target="_blank">÷ӿ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ػ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>