搜尋
首頁後端開發XML/RSS教程android sax解析xml檔(二)

android sax解析xml檔(二)

Feb 09, 2017 pm 02:06 PM
Androidxml文件

在上篇文章中,简单介绍了sax解析xml的一种方式,它是继承defaultHandler方式,并重写其中的几个方法来实现的。

接下来说的第二种方式是用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代表着根节点,参数为根节点的tagName*/    
        RootElement rootElement = new RootElement("classes");    
        /*获取一类子节点,并为其设置相应的事件   
         * 这里需要注意,虽然我们只设置了一次group的事件,但是我们文档中根节点下的所有   
         * group却都可以触发这个事件。   
         * */    
        Element groupElement = rootElement.getChild("group");    
        // 读到元素开始位置时触发,如读到<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";  
            }    
        });    
        //读到元素结束位置时触发,如读到</group>时    
        groupElement.setEndElementListener(new EndElementListener() {    
            @Override    
            public void end() {    
            }    
        });    
        Element personElement = groupElement.getChild("person");  
        //读取<person>标签触发  
        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>标签触发  
        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  
//                
//          }  
//      });  
        // 读到文本的末尾时触发,这里的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进行解析,那么两者到底有什么联系和区别呢?

     其实SAXParser是在SAX 1.0 定义的,而XMLReader则是在2.0中才开始出现的。你可以认为XMLReader的出现是为了替代SAXParser解析的,两者本质上干的事情是一样的,只不过XMLReader的功能更加的强悍而已。  

关于XMLReader的获取方式,除了通过SAXParser的getXMLReader方法获得之外,我们还可以通过以下两种方式。

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

以上就是 android sax解析xml文件(二)的内容,更多相关内容请关注PHP中文网(www.php.cn)!


陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
RSS文檔:Web聯合組織的基礎RSS文檔:Web聯合組織的基礎Apr 18, 2025 am 12:04 AM

RSS文檔是基於XML的結構化文件,用於發布和訂閱頻繁更新的內容。它的主要作用包括:1)自動化內容更新,2)內容聚合,3)提高瀏覽效率。通過RSSfeed,用戶可以訂閱並及時獲取來自不同來源的最新信息。

解碼RSS:內容提要的XML結構解碼RSS:內容提要的XML結構Apr 17, 2025 am 12:09 AM

RSS的XML結構包括:1.XML聲明和RSS版本,2.頻道(Channel),3.條目(Item)。這些部分構成了RSS文件的基礎,允許用戶通過解析XML數據來獲取和處理內容信息。

如何解析和利用基於XML的RSS提要如何解析和利用基於XML的RSS提要Apr 16, 2025 am 12:05 AM

RSSFEEDSUSEXMLTOSYNDICATECONTENT; PARSINGTHEMINVOLVESLOADINGINGINGINGINSSTRUCTURE,andExtractingData.ApplicationsIncludeBuildBuildingNewSagGregatorSaterNewSagGregatorSator andTrackingPodcastepodcastepisodes。

RSS文檔:他們如何提供您喜歡的內容RSS文檔:他們如何提供您喜歡的內容Apr 15, 2025 am 12:01 AM

RSS文檔的工作原理是通過XML文件發佈內容更新,用戶通過RSS閱讀器訂閱並接收通知。 1.內容髮布者創建並更新RSS文檔。 2.RSS閱讀器定期訪問並解析XML文件。 3.用戶瀏覽和閱讀更新內容。使用示例:訂閱TechCrunch的RSS源,只需複制鏈接到RSS閱讀器中即可。

用XML建造供稿:RSS的動手指南用XML建造供稿:RSS的動手指南Apr 14, 2025 am 12:17 AM

使用XML構建RSSfeed的步驟如下:1.創建根元素並設置版本;2.添加channel元素及其基本信息;3.添加條目(item)元素,包括標題、鏈接和描述;4.轉換XML結構為字符串並輸出。通過這些步驟,你可以從零開始創建一個有效的RSSfeed,並通過添加額外的元素如發布日期和作者信息來增強其功能。

創建RSS文檔:逐步教程創建RSS文檔:逐步教程Apr 13, 2025 am 12:10 AM

創建RSS文檔的步驟如下:1.使用XML格式編寫,根元素為,包含元素。 2.在內添加、、等元素描述頻道信息。 3.添加元素,每個代表一個內容條目,包含、、、等。 4.可選地添加和元素,豐富內容。 5.確保XML格式正確,使用在線工具驗證,優化性能並保持內容更新。

XML在RSS中的作用:聯合內容的基礎XML在RSS中的作用:聯合內容的基礎Apr 12, 2025 am 12:17 AM

XML在RSS中的核心作用是提供一種標準化和靈活的數據格式。 1.XML的結構和標記語言特性使其適合數據交換和存儲。 2.RSS利用XML創建標準化格式,方便內容共享。 3.XML在RSS中的應用包括定義feed內容的元素,如標題和發布日期。 4.優勢包括標準化和可擴展性,挑戰包括文件冗長和嚴格語法要求。 5.最佳實踐包括驗證XML有效性、保持簡潔、使用CDATA和定期更新。

從XML到可讀的內容:揭開RSS feed的神秘面紗從XML到可讀的內容:揭開RSS feed的神秘面紗Apr 11, 2025 am 12:03 AM

rssfeedsarexmldocuments usedforcontentAggregation and distribution.totransformthemintoreadableContent:1)parsethethexmlusinglibrarieslibrariesliblarieslikeparserinparserinpython.2)andledifferentifferentrssssssssssssssssssssssssssssssssssssssssssssssersions andpotentionparsingrorS.3)

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前By尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器