【17】XML解析

一、什么是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解析)