XML解析

一、概念

XML,英文全称为Extensible Markup Language,可扩展标记语言。XML只定义了文档的结构,如成对的标记、属性的位置等,至于这些标记和属性解析成什么由开发者自己决定。在Android中,XML解析有三种方式,DOM解析、SAX解析和PULL解析。

XML文件例子:(位于项目assets路径下,文件名为example.xml)

<apps>
    <app>
        <id>1</id>
        <name>Google Maps</name>
        <version>1.0</version>
    </app>
    <app>
        <id>2</id>
        <name>Chrome</name>
        <version>2.1</version>
    </app>
    <app>
        <id>3</id>
        <name>Google Play</name>
        <version>2.3</version>
    </app>
</apps>

二、DOM解析

优点:
● 形成了树结构,有助于更好的理解、掌握,且代码容易编写。
● 解析过程中,树结构保存在内存中,方便修改。

缺点:
● 由于文件是一次性读取,所以对内存的耗费比较大。
● 如果XML文件比较大,容易影响解析性能且可能会造成内存溢出。

例子:

private void xml_dom(){
    StringBuilder data = new StringBuilder();
    try {
        //打开assets文件夹下的xml示例文件到输入流
        InputStream in = getAssets().open("example.xml");
        //得到Document Builder Factory对象
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        //得到Document Builder对象
        DocumentBuilder builder = builderFactory.newDocumentBuilder();
        //得到Document存放整个xml的Document对象数据
        Document document = builder.parse(in);
        //得到xml数据的根节点
        Element rootElement = document.getDocumentElement();
        //得到根节点下所有app节点
        NodeList list = rootElement.getElementsByTagName("app");
        //遍历所有节点
        for (int i = 0;i < list.getLength(); i++){
            //获取app节点的所有子元素
            Element app = (Element) list.item(i);
            //获取app节点的子元素id,name,version,并添加到StringBuilder中
            data.append("id is " + app.getElementsByTagName("id").item(0).getTextContent() + "\n");
            data.append("name is " + app.getElementsByTagName("name").item(0).getTextContent() + "\n");
            data.append("version is " + app.getElementsByTagName("version").item(0).getTextContent() + "\n");
        }
        //更新UI
        dataText.setText(data);
    }catch (Exception e){
        e.printStackTrace();
    }
}

三、SAX解析

优点:
● 采用事件驱动模式,解析速度快,占用内存少。
● 非常适合在Android移动设备中使用。

缺点:
● 编码比较麻烦。
● 很难同时访问XML文件中的多处不同数据。

例子:

class ContentHandler extends DefaultHandler{
    private String nodeName;
    private StringBuilder id;
    private StringBuilder name;
    private StringBuilder version;
    private StringBuilder text;

    //在开始XML解析的时候调用
    @Override
    public void startDocument() throws SAXException {
        id = new StringBuilder();
        name = new StringBuilder();
        version = new StringBuilder();
        text = new StringBuilder();
    }

    //在解析某个节点的时候调用
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        nodeName = localName;
    }

    //在获取节点内容时调用
    //注意:获取内容时,该方法可能会被调用多次,同时换行符也会被当作内容解析出来
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if ("id".equals(nodeName)){
            id.append(ch, start, length);
        }else if ("name".equals(nodeName)){
            name.append(ch, start, length);
        }else if ("version".equals(nodeName)){
            version.append(ch, start, length);
        }
    }

    //在对某个节点的解析完成时调用
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if ("app".equals(localName)){
            text.append("id is " + id.toString() + "\n");
            text.append("name" + name.toString() + "\n");
            text.append("version is " + version.toString() + "\n");
            id.setLength(0);
            name.setLength(0);
            version.setLength(0);
        }
    }

    //整个XML解析完成的时候调用
    @Override
    public void endDocument() throws SAXException {
        dataText.setText(text);
        super.endDocument();

    }
}

private void xml_sax(){
    try {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        ContentHandler mHandler = new ContentHandler();
        //打开assets文件夹下的xml示例文件到输入流
        InputStream in = getAssets().open("example.xml");
        parser.parse(in,mHandler);

    } catch (Exception e) {
        e.printStackTrace();

    }
}

四、PULL解析

优点:
● PULL解析器小巧轻便,解析速度快,简单易用。
● 灵活性高,自由控制访问时机。
● 非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器。

缺点:
● 可扩展性差,无法修改XML树内容结构。

例子:

private void xml_pull(){
    /*
    try {
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        XmlPullParser parser = factory.newPullParser();
        parser.setInput(new StringReader(xmlData));
    } catch (XmlPullParserException e) {
        e.printStackTrace();
    }*/

    StringBuilder builder = new StringBuilder("");
    XmlPullParser parser = Xml.newPullParser();

    try {
        //打开assets文件夹下的xml示例文件到输入流
        InputStream in = getAssets().open("example.xml");
        parser.setInput(in,"UTF-8");
        while (parser.getEventType() != XmlPullParser.END_DOCUMENT){
            String nodeName = parser.getName();
            int eventType = parser.getEventType();
            switch (eventType){
                case XmlPullParser.START_DOCUMENT:
                    break;
                case XmlPullParser.START_TAG:
                    if ("id".equals(nodeName)){
                        builder.append("id is : " + parser.nextText() + "\n");
                    }else if ("name".equals(nodeName)){
                        builder.append("name is : "+ parser.nextText() + "\n");
                    }else if ("version".equals(nodeName)){
                        builder.append("version is : "+ parser.nextText() + "\n");
                    }
                    break;
                case XmlPullParser.END_TAG:
                    break;
            }
            parser.next();
        }
        dataText.setText(builder.toString());
    } catch (Exception e) {
        e.printStackTrace();
    }
} 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. XML总结 1.1. XML简介 XML : 可扩展的标记语言。(和HTML非常类似的) 可扩展的。 自定义...
    Ethan_Walker阅读 8,525评论 0 12
  • 一、绪论 上周工作需要了解项目的一些大体内容,结果在xml解析这一块看的迷迷糊糊的,所以在这里把学习到xm...
    cao健强阅读 9,772评论 1 7
  • Java Web开发实战经典 在项目开发中,HTML的主要功能是进行数据展示,而要进行数据存储结构的规范化就需要使...
    年少懵懂丶流年梦阅读 5,713评论 0 9
  • xml解析 xml简介 XML(eXtended Markup Language,可扩展标记性语言),xml可以对...
    无止无尽阅读 6,044评论 0 7
  • 项目地址:https://github.com/liaozhoubei/HttpAndParse XML是一种非常...
    宝塔山上的猫阅读 9,856评论 1 9

友情链接更多精彩内容