• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • SAX解析XML

    標簽: xml  sax  xml解析

    sax解析xml文檔是邊讀邊解的,解析時是按照提前設置好的事件處理方式來執行的。如果你在解析時,想回到前面的節點再次進行解析,對不起做不到。sax的解析方式就決定了它只能做讀的操作,不能做修改、添加、刪除的操作。
    sun公司將sax解析的事件分為ContentHandler(內容事件),ErrorHandler(錯誤事件),DTDHandler(DTD約束事件),EntityResolver(實體事件)。在解析xml時,遇到錯誤了就去執行ErrorHandler設置的事件處理程序。

    用到的xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    
    <書架> 
      < id="b1"> 
        <書名>Book1</書名>  
        <作者>auther1</作者>  
        <售價>50元</售價> 
      </>  
      < id="b2"> 
        <書名>Book2</書名>  
        <作者>auther2</作者>  
        <售價>價格2</售價> 
      </>  
    </書架>
    

    1、遍歷節點

    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.XMLReader;
    import org.xml.sax.helpers.DefaultHandler;
    
    public class Demo1 {
    
        public static void main(String[] args) throws Exception {
    
            //1, 創建解析工廠
            SAXParserFactory spf = SAXParserFactory.newInstance();
    
            //2, 得到解析器
            SAXParser sp = spf.newSAXParser();
    
            //3, 得到處理器
            XMLReader xml = sp.getXMLReader();
    
            //4, 設置內容處理器
            // 設置內容處理器必須要在讀取xml文檔之前。就好比,想吃飯就得先有碗。是吧!
            xml.setContentHandler(new MyHandler());
    
            //5, 讀取xml文檔,注意路徑
            xml.parse("src/testBook.xml");
    
        }
    
    }
    
    // 創建事件處理器類
    // 這里可以實現ContentHandler接口,也可以繼承DefaultHandler類。
    // DefaultHandler類是ContentHandler接口的一個默認實現類
    class MyHandler extends DefaultHandler{
    
        // 開始解析一個節點,qName表示元素的名字,attributes表示元素對應的屬性
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    
            System.out.println("<"+qName+">");
    
            // attributes != null 放在for循環中,是為了防止有的節點沒有屬性返回null
            for(int i = 0; attributes != null && i < attributes.getLength(); i++){
                String attrName = attributes.getQName(i);
                String attrVal = attributes.getValue(i);
                System.out.println(qName+"的屬性有:"+attrName+"="+attrVal);
            }
        }
    
        // 結束解析一個節點
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            System.out.println("</"+qName+">");
        }
    
        // 節點的內容
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            System.out.println(new String(ch, start, length));
        }
    
    }
    

    部分運行結果圖:
    這里寫圖片描述
    結果中會有一些換行,這些換行其實是xml文檔中的。書架和書之間的兩個空行的由來:這里寫圖片描述

    2、讀取指定的節點內容。比如:得到第二本書的作者

    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.XMLReader;
    import org.xml.sax.helpers.DefaultHandler;
    
    public class Demo2 {
    
        public static void main(String[] args) throws Exception {
    
            // sax解析的過程
    
            //1, 創建解析工廠
            SAXParserFactory spf = SAXParserFactory.newInstance();
    
            //2, 得到解析器
            SAXParser sp = spf.newSAXParser();
    
            //3, 得到處理器
            XMLReader xml = sp.getXMLReader();
    
            //4, 設置內容處理器
            xml.setContentHandler(new MyHandler1());
    
            //5, 讀取xml文檔
            xml.parse("src/testBook.xml");
    
        }
    
    }
    
    // 創建事件處理器類
    // 得到指定的內容。如:得到第二本書的作者
    class MyHandler1 extends DefaultHandler{
    
        private int currentNum;
        private String currentName;
        private int targetNum = 2;
        private String targetName = "作者";
    
        // 開始解析一個節點
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            currentName = qName;
            if(targetName.equals(currentName)){
                currentNum++;
            }
        }
    
        // 結束解析一個節點
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            currentName = null;
        }
    
        // 節點的內容
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            if(currentNum == targetNum && targetName.equals(currentName)){
                System.out.println(new String(ch, start, length));
            }
        }
    
    }
    
    

    運行結果:auther2

    版權聲明:本文為Q_Sea__原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/Q_Sea__/article/details/79187829

    智能推薦

    SAX解析xml文件

    1:SAX -->Simple Api For XML Processer         簡單的Api,用于解析xml文件。        特點:          僅能向前讀取數據。          不會將任...

    sax 解析xml

    本文是參考別人的寫的, 地址忘了,拿人手短,提前聲明一下。 解析步驟: 1.創建一個SAXParserFactory對象 SAXParserFactory factory=SAXParserFactory.newInstance(); 2.獲得解析器 SAXParser parser=factory.newSAXParser(); 3.調用解析方法解析xml,這里的第一個參數可以傳遞文件、流、字符...

    SAX解析XML

    什么是XML? XML 指可擴展標記語言(eXtensible Markup Language)。 你可以通過本站學習XML教程 XML 被設計用來傳輸和存儲數據。 XML是一套定義語義標記的規則,這些標記將文檔分成許多部件并對這些部件加以標識。 它也是元標記語言,即定義了用于定義其他與特定領域有關的、語義的、結構化的標記語言的句法語言。 python對XML的解析 常見的XML編程接口有DOM和...

    使用SAX解析XML文件(SAX解析)

    首先我的XML文件名為a.xml,路徑在項目目錄下,內容如下: 實現代碼如下: 實現效果如下:...

    XML解析(二):SAX解析

    概述       SAX(Simple API for XML)是java官方提供的另一種解析XML的方式。與DOM解析方式不同,SAX是采用事件驅動的方式解析文檔,解析前不需要讀入整個文檔,而讀文檔的過程就是解析的過程。事件驅動,就是一種基于回調(callback)機制的運行方法。 優點:采用事件驅動模式,對內存耗費較小,適用于只需要處...

    猜你喜歡

    XML解析(一),SAX解析XML

    轉載自  XML解析(一),SAX解析XML 一、概述  SAX,全稱Simple API for XML,是一種以事件驅動的XMl API,是XML解析的一種新的替代方法,解析XML常用的還有DOM解析,PULL解析(Android特有),SAX與DOM不同的是它邊掃描邊解析,自頂向下依次解析,由于邊掃描邊解析,所以它解析XML具有速度快,占用內存少的優點,對于An...

    android使用sax解析xml

    隨著技術的發展,現在的web已經和以前不同了。web已經逐漸像移動的方向傾斜,作為程序員的確應該拓展一下自己的知識層面。學習各方面的知識,今天就接著前幾天的弄一下android的xml解析,這次就使用sax的方式解析xml.下面就一步一步的來做吧。 1.編寫一個簡單的xml 2.編寫pojo類 3.寫一個解析xml的類 4.進行單元測試 最后來看一下運行效果圖,這里最好弄個filter,控制臺就沒...

    對XML進行Sax解析

    對XML進行Sax解析:  一、對XML進行Sax解析:   Sax解析XML是事件驅動的,安裝XML的順序一步一步進行解析的.優點不用事先調入整個文檔,占用資源少,缺點是事件過后,若沒保存數據,那么數據就丟了;無狀態性;從事件中只能得到文本,但不知該文本屬于哪個元素.    二、實現:  1.創建一個XMl文檔:     &n...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    精品国产乱码久久久久久蜜桃不卡