搜索
首页后端开发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;    
            
    }

1031.gif

我们都知道通过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:XML观点理解RSS:XML观点Apr 25, 2025 am 12:14 AM

RSS是一种基于XML的格式,用于发布经常更新的内容。1.RSSfeed通过XML结构化组织信息,包括标题、链接、描述等。2.创建RSSfeed需按照XML结构编写,添加元数据如语言和发布日期。3.高级用法可包含多媒体文件和分类信息。4.调试时使用XML验证工具,确保必需元素存在且编码正确。5.优化RSSfeed可通过分页、缓存和保持结构简洁来实现。通过理解和应用这些知识,可以有效管理和分发内容。

XML中的RSS:解码标签,属性和结构XML中的RSS:解码标签,属性和结构Apr 24, 2025 am 12:09 AM

RSS是一种基于XML的格式,用于发布和订阅内容。RSS文件的XML结构包括根元素、元素和多个元素,每个代表一个内容条目。通过XML解析器读取和解析RSS文件,用户可以订阅并获取最新内容。

XML在RSS中的优势:技术深度潜水XML在RSS中的优势:技术深度潜水Apr 23, 2025 am 12:02 AM

XML在RSS中具有结构化数据、可扩展性、跨平台兼容性和解析验证的优势。1)结构化数据确保内容的一致性和可靠性;2)可扩展性允许添加自定义标签以适应内容需求;3)跨平台兼容性使其在不同设备上无缝工作;4)解析和验证工具确保Feed的质量和完整性。

XML中的RSS:揭示内容联合的核心XML中的RSS:揭示内容联合的核心Apr 22, 2025 am 12:08 AM

RSS在XML中的实现方式是通过结构化的XML格式来组织内容。1)RSS使用XML作为数据交换格式,包含频道信息和项目列表等元素。2)生成RSS文件需按规范组织内容,发布到服务器供订阅。3)RSS文件可通过阅读器或插件订阅,实现内容自动更新。

超越基础:高级RSS文档功能超越基础:高级RSS文档功能Apr 21, 2025 am 12:03 AM

RSS的高级功能包括内容命名空间、扩展模块和条件订阅。1)内容命名空间扩展RSS功能,2)扩展模块如DublinCore或iTunes添加元数据,3)条件订阅根据特定条件筛选条目。这些功能通过添加XML元素和属性实现,提升信息获取效率。

XML主链:RSS提要如何结构XML主链:RSS提要如何结构Apr 20, 2025 am 12:02 AM

rssfeedsusexmltoStructureContentUpdates.1)xmlProvidesHierarchicalStructurefordata.2)theelementDefinestHefEed'sIdentityAndContainsElements.3)ElementsRementsRementsRepresSentividividividualContentpieces.4)rsssissisexisextensible,允许custemements.5)5)

RSS和XML:了解Web内容的动态二重奏RSS和XML:了解Web内容的动态二重奏Apr 19, 2025 am 12:03 AM

RSS和XML是用于网络内容管理的工具。RSS用于发布和订阅内容,XML用于存储和传输数据。它们的工作原理包括内容发布、订阅和更新推送。使用示例包括RSS发布博客文章和XML存储书籍信息。

RSS文档:Web联合组织的基础RSS文档:Web联合组织的基础Apr 18, 2025 am 12:04 AM

RSS文档是基于XML的结构化文件,用于发布和订阅频繁更新的内容。它的主要作用包括:1)自动化内容更新,2)内容聚合,3)提高浏览效率。通过RSSfeed,用户可以订阅并及时获取来自不同来源的最新信息。

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脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。