Android XML数据解析

1.XML数据要点介绍

2.三种解析XML方法的比较

3.SAX解析XML数据

核心代码:

public class SaxHelper extends DefaultHandler {
    private Person person;
    private ArrayList<Person> persons;

    //当前解析的元素标签
    private String tagName = null;

    /**
     * 当读取到文档开始标志是触发,通常在这里完成一些初始化操作
     * @throws SAXException
     */
    @Override
    public void startDocument() throws SAXException {
        this.persons = new ArrayList<Person>();
        Log.i("SAX", "读取到文档头,开始解析xml");

    }

    /**
     * 读到一个开始标签时调用,第二个参数为标签名,最后一个参数为属性数组
     * @param uri
     * @param localName
     * @param qName
     * @param attributes
     * @throws SAXException
     */
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws   SAXException {
        if (localName.equals("person")){
            person = new Person();
            person.setId(Integer.parseInt(attributes.getValue("id")));
            Log.i("SAX", "开始处理person元素~");

        }
        this.tagName = localName;

    }

    /**
     * 读到到内容,第一个参数为字符串内容,后面依次为起始位置与长度
     * @param ch
     * @param start
     * @param length
     * @throws SAXException
     */
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        //判断当前标签是否有效
        if (this.tagName != null){
            String data = new String(ch, start, length);

            //读取标签中的内容
            if (this.tagName.equals("name")){
                this.person.setName(data);
                Log.i("SAX", "处理name元素内容");

            }else if (this.tagName.equals("age")){
                this.person.setAge(Integer.parseInt(data));
                Log.i("SAX", "处理age元素内容");

            }

        }

    }

    /**
     * 处理元素结束时触发,这里将对象添加到结合中
     * @param uri
     * @param localName
     * @param qName
     * @throws SAXException
     */
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if (localName.equals("person")){
            this.persons.add(person);
            person = null;
            Log.i("SAX", "处理person元素结束~");

        }
        this.tagName = null;

    }

    /**
     * 读取到文档结尾时触发,
     * @throws SAXException
     */
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
        Log.i("SAX", "读取到文档尾,xml解析结束");
    }

    //获取persons集合
    public ArrayList<Person> getPersons(){
        return  persons;
    }

}

在MainActivity.java中写上写上这样一个方法,然后要解析XML的时候调用下

private ArrayList<Person> readxmlForSAX() throws Exception { 

      //获取文件资源建立输入流对象
      InputStream is = getAssets().open("person1.xml");

     //①创建XML解析处理器 
      SaxHelper ss = new SaxHelper(); 

      //②得到SAX解析工厂 
      SAXParserFactory factory = SAXParserFactory.newInstance();

      //③创建SAX解析器 
      SAXParser parser = factory.newSAXParser(); 

      //④将xml解析处理器分配给解析器,对文档进行解析,将事件发送给处理器 
          parser.parse(is, ss);

         is.close();
         return ss.getPersons();

}

4.DOM解析XML数据

核心代码:

public class DomHelper {

  public static ArrayList<Person> queryXML(Context mContent){

    ArrayList<Person> persons = new ArrayList<Person>();

    try {
        //①获得DOM解析器的工厂示例:
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();

        //②从Dom工厂中获得dom解析器
        DocumentBuilder builder = dbFactory.newDocumentBuilder();

        //③把要解析的xml文件读入Dom解析器
        Document document = builder.parse(mContent.getAssets().open("person2.xml"));
        System.out.println("处理该文档的DomImplemention对象=" + document.getImplementation());

        //④得到文档中名称为person的元素的结点列表
        NodeList nodeList = document.getElementsByTagName("person");

        //⑤遍历该集合,显示集合中的元素以及子元素的名字
        for (int i = 0; i < nodeList.getLength(); i ++){
            //先从Person元素开始解析
            Element personElement = (Element)nodeList.item(i);
            Person person = new Person();
            person.setId(Integer.valueOf(personElement.getAttribute("id")));

            //获取person下的name和age的Note集合
            NodeList childList = personElement.getChildNodes();
            for (int j = 0; j < childList.getLength(); j ++){

                Node childNode = childList.item(j);

                //判断子note类型是否为元素Note
                if (childNode.getNodeType() == Node.ELEMENT_NODE){

                    Element childElement = (Element)childNode;

                    if ("name".equals(childElement.getNodeName())){
                        person.setName(childElement.getFirstChild().getNodeValue());

                    }else if("age".equals(childElement.getNodeName())){
                        person.setAge(Integer.valueOf(childElement.getFirstChild().getNodeValue()));

                    }

                }

            }
            persons.add(person);

        }

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

}

5.PULL解析XML数据



核心代码:

public static ArrayList<Person> getPersons(InputStream xml) throws Exception{
    ArrayList<Person> persons = null;
    Person person = null;

    // 创建一个xml解析的工厂
    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();

    // 获得xml解析类的引用
    XmlPullParser parser = factory.newPullParser();
    parser.setInput(xml, "UTF-8");

    // 获得事件的类型
    int eventType = parser.getEventType();
    while (eventType != XmlPullParser.END_DOCUMENT){
        switch (eventType){
            case XmlPullParser.START_DOCUMENT:{
                persons = new ArrayList<Person>();
                break;

            }
            case XmlPullParser.START_TAG:{
                if ("person".equals(parser.getName())){
                    person = new Person();

                    // 取出属性值
                    int id = Integer.parseInt(parser.getAttributeValue(0));
                    person.setId(id);

                }else if("name".equals(parser.getName())){
                    // 获取该节点的内容
                    String name = parser.nextText();
                    person.setName(name);

                }else if("age".equals(parser.getName())){
                    int age = Integer.parseInt(parser.nextText());
                    person.setAge(age);

                }
                break;

            }
            case XmlPullParser.END_TAG:{
                if ("person".equals(parser.getName())){
                    persons.add(person);
                    person = null;

                }
                break;

            }

        }
        eventType = parser.next();


    }
    return persons;

}


核心代码:

public static void save(List<Person> persons, OutputStream outputStream) throws Exception{
    XmlSerializer serializer = Xml.newSerializer();
    serializer.setOutput(outputStream, "UTF-8");
    serializer.startDocument("UTF-8", true);
    serializer.startTag(null, "persons");
    for (Person person: persons) {
        serializer.startTag(null, "person");
        serializer.attribute(null, "id", person.getId() + "");

        serializer.startTag(null, "name");
        serializer.text(person.getName());
        serializer.endTag(null, "name");

        serializer.startTag(null, "age");
        serializer.text(person.getAge() + "");
        serializer.endTag(null, "age");

        serializer.endTag(null, "person");

    }
    serializer.endTag(null, "persons");
    serializer.endDocument();
    outputStream.flush();
    outputStream.close();


}

代码下载XMLParseDemo.zip下载 XMLParseDemo.zip

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335

推荐阅读更多精彩内容

  • 1 XML解析No29 【 XML:可拓展标记语言,语言和HTML类似,也是一种标记语言。 特点:标记是自定义...
    征程_Journey阅读 1,605评论 0 9
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,513评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,510评论 18 139
  • 一. Java基础部分.................................................
    wy_sure阅读 3,777评论 0 11
  • 本文参加#未完待续,就要表白#活动,本人承诺,文章内容为原创,且未在其他平台发表过。 结束一个星期的忙碌备战,我又...
    风车不停阅读 403评论 0 4