小菜毛毛技術分享

          與大家共同成長

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            164 Posts :: 141 Stories :: 94 Comments :: 0 Trackbacks
          用SAX解析xml文件的例子
          2008-07-15 09:46
          1. Xml技術簡介
          Xml文件有兩種約束類型,包括文檔類型定義(DTD)和Xml 模式(Schema)。Xml DTD被包含在xml1的標準里。Xml 模式被包含在W3C的標準中。在xml 數據和xml 模式兩者之間有很多的區別。
          A. xml模式支持的數據類型比xml DTD多;
          B. xml模式在無序的情況下使用起來比xml DTD更方便;
          C. xml模式支持名字空間,可以在不同的文件中定義相同的方法等。
          D. xml模式形成的文檔可以被多種標準解析,如dom,sax或者jdom等,而xml DTD方式下確不行。
          2. Xml文件解析
          在java語言環境里可以使用三種方法解析xml文件:dom(document object model),sax(simple api for xml)和jdom(java document object model)。
          SAX提供了基于事件的方式進行解析,適合于快速,數據量小的解析情況。SAX解析有幾個缺陷:A.它的解析是連續的;B.數據無法回朔。
          DOM解析不同于SAX。它提供了內存中完整的xml數據映像,數據被存儲在樹狀結構中。DOM解析方式更容易獲得和處理數據。
          JDOM是java語言中特有的,主要用來支持xpath標準。
          3. SAX解析方式
          上面我簡要介紹了幾種解析xml文件的技術,這里我們使用SAX技術給出一個小例子,大家可以從這個例子中發現如果你能夠掌握一些開源軟件包,你就可以很 快掌握解析xml數據的技術。
          3.1制作一個簡單的xml文件component.xml
          <?xml version="1.0"?>
          <XmlComponents>
          <XmlComponent>
          <ComNo>1</ComNo>
          </XmlComponent>
          </XmlComponents>

          3.2下載xerces.jar軟件包
          在Apache網站上×××下載xerces.jar軟件包,這個包中包含了上面我們列舉的幾種解析xml數據的API。然后將這個軟件包加入到程序的 classpath中。
          3.3制作解析類MySaxParser.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;

          // 運行主方法
          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
          // 處理各種分隔符號
          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")) //空的value不打印
          System.out.println(getIndent()+ " Value: " + s);
          }

          // 處理文檔尾
          public void endDocument() throws SAXException {
          idx -= INDENT;
          System.out.println(getIndent() + "end document");

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

          // 處理標記尾
          public void endElement(String uri, String localName, String qName) throws SAXException {
          idx -= INDENT;
          }

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

          // 處理標記頭
          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();
          }

          }


          總結,雖然解析xml數據很復雜,因為涉及了很多的遞歸算法,但是我們可以使用業界比較成熟的解析API來進行xml數據處理。我現在只是給出了一個非常 簡單的例子,但是在真實系統中遠比這個要復雜的多,大家以后在使用的使用會發現還是有很多的工作要做的。
          posted on 2010-03-17 17:37 小菜毛毛 閱讀(3805) 評論(2)  編輯  收藏 所屬分類: XML

          Feedback

          #  SAX 的屬性問題 [未登錄] 2012-06-04 15:07 木木
          如果 要是<XmlComponents> 有個屬性值 怎么丟過去 我用了 if(屬性值.getlength()!=0) 怎么說呢 現在遇到的問題我要按 一個屬性id 查找一個元素 比如吧<XmlComponents id="01"><name></name>
          <age></age> </XmlComponents>
          XmlComponents id="02"><name></name>
          <age></age> </XmlComponents>   回復  更多評論
            

          # re: SAX解析XML例子[未登錄] 2013-12-13 10:44 dd
          jgjgjg  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 若尔盖县| 通化县| 富民县| 蒙城县| 平武县| 奇台县| 武穴市| 抚顺市| 仁化县| 巢湖市| 达州市| 罗城| 龙江县| 扶绥县| 延长县| 保山市| 南开区| 永吉县| 高淳县| 沈阳市| 彩票| 红桥区| 广西| 乳源| 东兰县| 余干县| 宁安市| 静安区| 福贡县| 万盛区| 大安市| 遂溪县| 靖江市| 建昌县| 天门市| 乌鲁木齐市| 天等县| 康乐县| 阜新市| 宜昌市| 宜章县|