成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

android中sax解析xml文件的方法

這篇文章將為大家詳細講解有關 android中sax解析xml文件的方法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

網站建設哪家好,找成都創(chuàng)新互聯(lián)!專注于網頁設計、網站建設、微信開發(fā)、小程序定制開發(fā)、集團企業(yè)網站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了樂東黎族免費建站歡迎大家使用!

是用RootElement這個類來解析的,RootElement 內置了defaultHandler的子類,

RootElement 源碼如下:

public class RootElement extends Element {  
  
    final Handler handler = new Handler();  
  
    /**  
     * Constructs a new root element with the given name.  
     *  
     * @param uri the namespace  
     * @param localName the local name  
     */  
    public RootElement(String uri, String localName) {  
        super(null, uri, localName, 0);  
    }  
  
    /**  
     * Constructs a new root element with the given name. Uses an empty string  
     * as the namespace.  
     *  
     * @param localName the local name  
     */  
    public RootElement(String localName) {  
        this("", localName);  
    }  
  
    /**  
     * Gets the SAX {@code ContentHandler}. Pass this to your SAX parser.  
     */  
    public ContentHandler getContentHandler() {  
        return this.handler;  
    }  
  
    class Handler extends DefaultHandler {  
  
        Locator locator;  
        int depth = -1;  
        Element current = null;  
        StringBuilder bodyBuilder = null;  
  
        @Override  
        public void setDocumentLocator(Locator locator) {  
            this.locator = locator;  
        }  
  
        @Override  
        public void startElement(String uri, String localName, String qName,  
                Attributes attributes) throws SAXException {  
            int depth = ++this.depth;  
  
            if (depth == 0) {  
                // This is the root element.  
                startRoot(uri, localName, attributes);  
                return;  
            }  
  
            // Prohibit mixed text and elements.  
            if (bodyBuilder != null) {  
                throw new BadXmlException("Encountered mixed content"  
                        + " within text element named " + current + ".",  
                        locator);  
            }  
  
            // If we're one level below the current element.  
            if (depth == current.depth + 1) {  
                // Look for a child to push onto the stack.  
                Children children = current.children;  
                if (children != null) {  
                    Element child = children.get(uri, localName);  
                    if (child != null) {  
                        start(child, attributes);  
                    }  
                }  
            }  
        }  
  
        void startRoot(String uri, String localName, Attributes attributes)  
                throws SAXException {  
            Element root = RootElement.this;  
            if (root.uri.compareTo(uri) != 0  
                    || root.localName.compareTo(localName) != 0) {  
                throw new BadXmlException("Root element name does"  
                        + " not match. Expected: " + root + ", Got: "  
                        + Element.toString(uri, localName), locator);  
            }  
  
            start(root, attributes);  
        }  
  
        void start(Element e, Attributes attributes) {  
            // Push element onto the stack.  
            this.current = e;  
  
            if (e.startElementListener != null) {  
                e.startElementListener.start(attributes);  
            }  
  
            if (e.endTextElementListener != null) {  
                this.bodyBuilder = new StringBuilder();  
            }  
              
            e.resetRequiredChildren();  
            e.visited = true;  
        }  
  
        @Override  
        public void characters(char[] buffer, int start, int length)  
                throws SAXException {  
            if (bodyBuilder != null) {  
                bodyBuilder.append(buffer, start, length);  
            }  
        }  
  
        @Override  
        public void endElement(String uri, String localName, String qName)  
                throws SAXException {  
            Element current = this.current;  
  
            // If we've ended the current element...  
            if (depth == current.depth) {  
                current.checkRequiredChildren(locator);  
  
                // Invoke end element listener.  
                if (current.endElementListener != null) {  
                    current.endElementListener.end();  
                }  
  
                // Invoke end text element listener.  
                if (bodyBuilder != null) {  
                    String body = bodyBuilder.toString();  
                    bodyBuilder = null;  
  
                    // We can assume that this listener is present.  
                    current.endTextElementListener.end(body);  
                }  
  
                // Pop element off the stack.  
                this.current = current.parent;  
            }  
  
            depth--;  
        }  
    }  
}

以上是RootElement類得源碼,從源碼可以看出,它只是將defaultHandler簡單的處理一下。

具體應用可以參照我寫的測試源碼

/**  
     * sax解析xml的第二種方式  
     *      用XMLReader 也是sax的一種方式  
     * @return  
     */  
    private String saxParseSecond(){  
        //讀取src下xml文件  
        InputStream inputStream =  
             this.getClass().getClassLoader().getResourceAsStream("saxTest.xml");  
        SAXParserFactory factory = SAXParserFactory.newInstance();  
        try {  
            SAXParser parse = factory.newSAXParser();  
            XMLReader reader = parse.getXMLReader();  
            reader.setContentHandler(getRootElement().getContentHandler());  
            reader.parse(new InputSource(inputStream));  
        } catch (ParserConfigurationException e) {  
            e.printStackTrace();  
        } catch (SAXException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return result;  
    }
/**   
     *    
     * @return 返回設置好處理機制的rootElement   
     */    
    private RootElement getRootElement(){    
            
        /*rootElement代表著根節(jié)點,參數(shù)為根節(jié)點的tagName*/    
        RootElement rootElement = new RootElement("classes");    
        /*獲取一類子節(jié)點,并為其設置相應的事件   
         * 這里需要注意,雖然我們只設置了一次group的事件,但是我們文檔中根節(jié)點下的所有   
         * group卻都可以觸發(fā)這個事件。   
         * */    
        Element groupElement = rootElement.getChild("group");    
        // 讀到元素開始位置時觸發(fā),如讀到<group>時    
        groupElement.setStartElementListener(new StartElementListener() {    
            @Override    
            public void start(Attributes attributes) {    
//                Log.i("TEST", "start");    
               String groupName =  attributes.getValue("name");  
               String groupNum =  attributes.getValue("num");  
               result = result+"groupName ="+groupName+"groupNum = "+groupNum+"\n";  
            }    
        });    
        //讀到元素結束位置時觸發(fā),如讀到</group>時    
        groupElement.setEndElementListener(new EndElementListener() {    
            @Override    
            public void end() {    
            }    
        });    
        Element personElement = groupElement.getChild("person");  
        //讀取<person>標簽觸發(fā)  
        personElement.setStartElementListener(new StartElementListener() {  
              
            @Override  
            public void start(Attributes attributes) {  
                 String personName =  attributes.getValue("name");  
                 String age =  attributes.getValue("age");  
                 result = result+"personName ="+personName+"age = "+age+"\n";  
            }  
        });  
        //讀取</person>標簽觸發(fā)  
        personElement.setEndElementListener(new EndElementListener() {  
              
            @Override  
            public void end() {  
                  
            }  
        });  
          
        Element chinese = personElement.getChild("chinese");    
//        chinese.setTextElementListener(new TextElementListener() {  
//            
//          @Override  
//          public void end(String body) {  
//              // TODO Auto-generated method stub  
//                
//          }  
//            
//          @Override  
//          public void start(Attributes attributes) {  
//              // TODO Auto-generated method stub  
//                
//          }  
//      });  
        // 讀到文本的末尾時觸發(fā),這里的body即為文本的內容部分    
        chinese.setEndTextElementListener(new EndTextElementListener() {    
            @Override    
            public void end(String body) {    
                Pattern p = Pattern.compile("\\s*|\t|\r|\n");   
                Matcher m = p.matcher(body);   
                body = m.replaceAll("");   
                result = result+"chinese ="+body;  
            }    
        });    
            
        Element english = personElement.getChild("english");    
        english.setEndTextElementListener(new EndTextElementListener() {    
            @Override    
            public void end(String body) {    
                Pattern p = Pattern.compile("\\s*|\t|\r|\n");   
                Matcher m = p.matcher(body);   
                body = m.replaceAll("");   
               result = result+"english ="+body+"\n";  
            }    
        });    
        return rootElement;    
            
    }

android中sax解析xml文件的方法

我們都知道通過SAXParser對象解析xml的方式,這里我們又從代碼中看到了利用另一個對象XMLReader進行解析,那么兩者到底有什么聯(lián)系和區(qū)別呢?

其實SAXParser是在SAX 1.0 定義的,而XMLReader則是在2.0中才開始出現(xiàn)的。你可以認為XMLReader的出現(xiàn)是為了替代SAXParser解析的,兩者本質上干的事情是一樣的,只不過XMLReader的功能更加的強悍而已。

關于XMLReader的獲取方式,除了通過SAXParser的getXMLReader方法獲得之外,我們還可以通過以下兩種方式。

XMLReader parser=XMLReaderFactory.createXMLReader(); (1)
XMLReader parser=XMLReaderFactory.createXMLReader(String className); (2)

關于“ android中sax解析xml文件的方法”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

網站名稱:android中sax解析xml文件的方法
本文來源:http://jinyejixie.com/article16/pdcedg.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供品牌網站制作、網站排名網站設計、網站改版、企業(yè)建站

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網站優(yōu)化
双桥区| 张家口市| 曲周县| 龙里县| 吴旗县| 江油市| 肇庆市| 东乌| 沭阳县| 罗定市| 丰宁| 图们市| 鹤壁市| 兰考县| 榆社县| 房产| 南部县| 梅河口市| 阿坝| 宣威市| 蒙阴县| 乌恰县| 永新县| 广平县| 东海县| 鄄城县| 镇康县| 西畴县| 高雄市| 锡林浩特市| 西安市| 宁强县| 什邡市| 台江县| 九龙坡区| 盐亭县| 黄梅县| 德安县| 南通市| 太仆寺旗| 温州市|