【17】XML解析

作者: 嗟嗟嗟 | 来源:发表于2016-06-26 02:35 被阅读0次

一、什么是XML解析?

XML是一种简单通用的数据格式,很多配置文件和简单的存储文件都是由这种格式组成的,他的好处是格式清晰、易读。大名鼎鼎的EXCEL文件就可以转换为XML格式存储和传递。

XML的解析顾名思义就是对这种格式的文件做出解读,分析出其中的数据格式,得到有用的数据。

二、为什么要用XML?

数据在传递的时候,要尽可能的小巧,XML文件能够很好的用少量字符,表达格式和数据的关系。他比JSON的好处是更加易读和对UI界面比较友好。

三、如何解析?

1.pull解析

通过pull可以很方便的解析XML格式,他的优点是快速,小巧。

以下实力码代码。

private void parseXMLWithPull() {
    try {
        XmlResourceParser xmlResourceParser =  getResources().getXml(R.xml.apps);
        int eventType = xmlResourceParser.getEventType();
        String id = "";
        String name = "";
        String version = "";
        while (eventType != XmlPullParser.END_DOCUMENT){
            String nodeName = xmlResourceParser.getName();
            switch (eventType){
                //节点开始时,读取数据
                case XmlPullParser.START_TAG:
                    if("id".equals(nodeName)){
                        id = xmlResourceParser.nextText();
                    }else if("name".equals(nodeName)){
                        name = xmlResourceParser.nextText();
                    }else if("version".equals(nodeName)){
                        version = xmlResourceParser.nextText();
                    }
                    break;
                //节点结束时,打印出数据
                case XmlPullParser.END_TAG:
                    if("app".equals(nodeName)){
                        Log.i("info","id is " + id);
                        Log.i("info","name is " + name);
                        Log.i("info","version is " + version);
                    }
                    break;
            }
            //转到下一个节点
            eventType = xmlResourceParser.next();
        }
    } catch (XmlPullParserException e) {
        e.printStackTrace();
        Log.i("info","解析错误");
    } catch (IOException e) {
        e.printStackTrace();
        Log.i("info","IO错误");
    }
}

代码有注释,就不详细介绍了,可以看到pull解析,是以节点为单位来解析的,一个节点一个节点的向下解析。所以比较方便灵活,但不适合解析复杂的数据。

2.sax解析

sax的解析方式,比较传统,是把所有数据先统一读取,然后规划好读取方式后再进行分析读取的。

他需要先继承一个DefaultHandler的类来实现其方法。

public class SaxParserHandler extends DefaultHandler {

    private String nodeName;

    private StringBuilder id;
    private StringBuilder name;
    private StringBuilder version;

    @Override
    public void startDocument() throws SAXException {
        super.startDocument();

        id = new StringBuilder();
        name = new StringBuilder();
        version = new StringBuilder();

    }

    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);

        nodeName = localName;
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        if("app".equals(localName)){

            Log.i("info","id = " + id.toString().trim());
            Log.i("info","name = " + name.toString().trim());
            Log.i("info","version = " + version.toString().trim());
            id.setLength(0);
            name.setLength(0);
            version.setLength(0);
        }


    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);

        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);
        }

    }
}

主要就实现这几个方法,包括开始文件读取,结束文件读取,开始节点读取,结束节点读取,开始数据读取,这5个重要的方法。

最后在主方法调用他们就行了。

try {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser saxParser = factory.newSAXParser();
    SaxParserHandler saxParserHandler = new SaxParserHandler();
    saxParser.parse(new InputSource(getResources().openRawResource(R.raw.apps)),saxParserHandler);
} catch (ParserConfigurationException e) {
    e.printStackTrace();
    Log.i("info","Sax配置错误");
} catch (SAXException e) {
    e.printStackTrace();
    Log.i("info","解析错误");
} catch (IOException e) {
    e.printStackTrace();
    Log.i("info","IO错误");
}

3.dom方式解析

这个用的不多,主要我也没代码可码,就不说了。。

相关文章

  • 【17】XML解析

    一、什么是XML解析? XML是一种简单通用的数据格式,很多配置文件和简单的存储文件都是由这种格式组成的,他的好处...

  • iOS解析XML

    2.0 XML解析 2.1 XML简单介绍 (1) XML:可扩展标记语言 (2) XML解析 2.2 XML解析...

  • iOS开发-XML解析

    一、 XML解析 1.1 XML简单介绍 (1) XML:可扩展标记语言 (2) XML解析 1.2 XML解析 ...

  • 3-XML解析

    3.0 XML解析 3.1 XML简单介绍 (1) XML:可扩展标记语言 (2) XML解析 3.2 XML解析...

  • XML、JSON解析

    XML解析 XML_GData解析 JSON解析

  • 05、网络解析

    解析:从事先规定好的格式中提取数据iOS开发常见的解析:XML解析,JSON解析 XML解析 XMl事例: XML...

  • Senior进阶 网络之数据解析之XML解析和JSON解析的用法

    Senior进阶 网络之数据解析之XML解析和JSON解析的用法 XML解析之SAX解析 XML解析之DOM解析 ...

  • XML

    NSXMLParser解析XML GDataXML解析XML

  • XML*

    目录 XML简介 XML基本语法 XML解析 * DOM解析   * DOM解析原理及工具   * DOM4J解析...

  • 面试相关

    1.Json解析与XML解析 Gson解析和FastJson ,FastJson解析效率高 XML解析,SAX解析...

网友评论

    本文标题:【17】XML解析

    本文链接:https://www.haomeiwen.com/subject/tybadttx.html