Android 简易XML解析

首先创建在Android工程中创建一个Assets文件夹 app/src/main/assets

在这里添加一个名为 data.xml的文件,然后编辑这个文件,加入如下XML格式内容

<?xml version="1.0" encoding="utf-8"?>
<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>

==============获取XML中内容================

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try {
            //获取XML文件的输入流
            InputStream fis = getResources().getAssets().open("data.xml");
            InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
            StringBuffer stringBuffer = new StringBuffer();
            int mark = -1;
            while ((mark = isr.read()) != -1) {
                stringBuffer.append((char) mark);
            }
            String data = stringBuffer.toString();
            //把整个文件内容以String方式传入
            //parseXMLWithPull(data);
            //parseXMLWithSAX(data);

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

    }

==============Pull解析方式=================

获取解析工具XmlPullParser:XmlPullParserFactory factory = XmlPullParserFactory.newInstance();XmlPullParser xmlPullParser = factory.newPullParser();

传入XML字符流:xmlPullParser.setInput(new StringReader(xmlData));

根据节点特征进行处理:switch ( xmlPullParser.getEventType() )

    private void parseXMLWithPull(String xmlData) {
        try {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser xmlPullParser = factory.newPullParser();
            xmlPullParser.setInput(new StringReader(xmlData));
            int eventType = xmlPullParser.getEventType();
            String id = "";
            String name = "";
            String version = "";
            while (eventType != xmlPullParser.END_DOCUMENT) {
                String nodeName = xmlPullParser.getName();
                switch (eventType) {
                    //开始解析某个节点
                    case XmlPullParser.START_TAG: {
                        if ("id".equals(nodeName)) {
                            id = xmlPullParser.nextText();
                        } else if ("name".equals(nodeName)) {
                            name = xmlPullParser.nextText();
                        } else if ("version".equals(nodeName)) {
                            version = xmlPullParser.nextText();
                        }
                    }
                    break;
                    //完成解析某个节点
                    case XmlPullParser.END_TAG: {
                        if ("app".equals(nodeName)) {
                            Log.d("woider", "id is " + id);
                            Log.d("woider", "name is " + name);
                            Log.d("woider", "version is " + version);
                        }
                    }
                    break;
                }
                eventType = xmlPullParser.next();
            }

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

parseXMLWithPull

==============SAX解析方式=================

使用SAX解析通常需要创建一个类继承DefaultHandler,并重写父类的五个方法

startDocument():开始XML解析的时候调用
startElement():开始解析某个结点的时候调用
characters():获取节点中内容的时候调用
endElement():完成解析某个节点的时候调用
endDocument():完成整个XML解析的时候调用

public class ContentHandler extends DefaultHandler {

    private String nodeName;
    private StringBuilder id;
    private StringBuilder name;
    private StringBuilder version;

    @Override
    public void startDocument() throws SAXException {
        id = new StringBuilder();
        name = new StringBuilder();
        version = 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 {
        //进行格式规范化
        String str = new String(ch, start, length).trim();
        //根据当前节点名添加内容
        if ("id".equals(nodeName)) {
            id.append(str);
        } else if ("name".equals(nodeName)) {
            name.append(str);
        } else if ("version".equals(nodeName)) {
            version.append(str);
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if ("app".equals(localName)) {
            Log.d("woider", "id is " + id);
            Log.d("woider", "name is " + name);
            Log.d("woider", "version is " + version);
            //清空StringBuilder
            id.setLength(0);
            name.setLength(0);
            version.setLength(0);
        }
    }

    @Override
    public void endDocument() throws SAXException {
    }
}

ContentHandler

获取解析工具XMLReader:SAXParserFactory factory = SAXParserFactory.newInstance();XMLReader xmlReader = factory.newSAXParser().getXMLReader();

传入规则到解析工具:ContentHandler handler = new ContentHandler();xmlReader.setContentHandler(handler);

开始执行解析:xmlReader.parse(new InputSource(new StringReader(xmlData)));

    private void parseXMLWithSAX(String xmlData) {
        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            XMLReader xmlReader = factory.newSAXParser().getXMLReader();
            ContentHandler handler = new ContentHandler();
            //将ContentHandler的实例设置到XMLReader中
            xmlReader.setContentHandler(handler);
            //开始执行解析
            xmlReader.parse(new InputSource(new StringReader(xmlData)));

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

parseXMLWithSAX


 方法二(直接针对InputStream解析)

获取解析工具SAXParser:SAXParserFactory factory = SAXParserFactory.newInstance();SAXParser parser = factory.newSAXParser();

获取规则和输入流:handler = new ParserHandler();InputStream inputStream = getResources().getAssets().open("data.xml");

同时传入开始解析:parser.parse(inputStream, handler);

 最后打印 LogCat 中的日志,data.xml的解析就完成了

除了 Pull 解析和 SAX 解析之外,还有一种 DOM 解析也非常重要。

另外还有一些XML解析工具,比如 JDOM 和 DOM4J,它们简化了解析的步骤,提高了解析的效率。

时间: 2024-11-08 04:28:46

Android 简易XML解析的相关文章

Android学习xml解析大全之SAX和DOM

  随着android的学习解析xml成为了很多朋友面临的问.想学习如何解析xml就要先了解xml是什么. XML称为可扩展标记语言(Extensible Markup Language),由标准通用标记语言(SGML:Standard Generalized Markup Language)发展而来,允许开发者自定义标签,可以实现标签和内容的有效分离. 与HTML不同,XML不再侧重于数据如何表现,而是更多的关注数据如何存储和传输.因此,XML逐渐演变成为一种跨平台的数据交换格式.通过使用XM

Android实现XML解析技术

http://www.cnblogs.com/hanyonglu/archive/2012/02/28/2370675.html http://weizhulin.blog.51cto.com/1556324/311678 Android实现XML解析技术

Android 之xml解析

HTTP网络传输中的数据组织方式有三种方式:1.HTML方式2.XML方式 3.JSON方式 XML称为可扩展标记语言,它与HTML一样,都是SGML(标准通用标记语言) XML是Internet环境中跨平台的,依赖于内容技术,是当前处理结构化文档信息的有力工具,可扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据. xml文件的节点的种类,一种是ElementNode,一种是TextNode.像<persons>.<person>这种节点就属于Element

Android中XML解析-PULL解析

前面写了两篇XML解析的Dom和SAX方式,Dom比较符合思维方式,SAX事件驱动注重效率,除了这两种方式以外也可以使用Android内置的Pull解析器解析XML文件. Pull解析器的运行方式与 SAX 解析器相似,也是事件触发的.Pull解析方式让应用程序完全控制文档该怎么样被解析,比如开始和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件.通过Parser.getEventType()方法来取得事件的代码值,解析是在开始时就完成了大部分处理.事件将作为数值代码

Android中XML解析-Dom解析

Android中需要解析服务器端传过来的数据,由于XML是与平台无关的特性,被广泛运用于数据通信中,有的时候需要解析xml数据,格式有三种方式,分别是DOM.SAX以及PULL三种方式,本文就简单以Dom解析为例,解析XML, DOM方式解析xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据的,但是这样一来,如果xml文件很大,手机CPU处理能力比PC差,因此在处理效率方面就相对差了,使用Dom解析就不是太合适了. 基础维护 首先下assets目录下新建一个Bo

Android中XML解析

package com.example.thebroadproject; public class Book { private int id; private String name; private float price; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setN

android之XML解析

所谓SAX,就是SAX simple API for XML,是一个解析XML文件的简单API. SAX解析XML的工作原理,是对文档进行顺序扫描,当扫描到文档开始与结束,元素开始与结束,触发相应的响应函数.是一种事件驱动型的解析方式.它可以在解析文档的任意时刻停止解析. 通过该图我们可以大概了解解析的过程. private void parse(String xmlString,List<Mp3Info> infos){ // SAXParserFactory 是一个使用工厂模式的类 SAX

Android自定义xml解析

<?xml version="1.0" encoding="utf-8"?> <resources> <Users> <User name="jason" age="12" location="Beijing"/> <User name="peter" age="18" location="Shangha

Android APK XML解析与反编译方法

APK中的XML为何不能直接打开,是否只是简单的二进制文件,难道被加密了?为什么AXMLPrinter2反编译的时候竟然报错了,如何解决? java.lang.ArrayIndexOutOfBoundsException: 128 at android.content.res.StringBlock.getShort(StringBlock.java:231) at android.content.res.StringBlock.getString(StringBlock.java:91) at