Android XML 解析与生成

选择解析方式

XML 的解析与生成有很多方式(SAX、Pull、Dom),其中 Pull 是 android 系统解析 XML 的一种方式,所以本文采用的是 Pull 的方式解析和生成Xml。

解析

XmlPullParser 的核心方法

  • setInput(InputStream inputStream, String inputEncoding)

    设置解析器要处理的输入流

  • getEventType()

    返回当前事件的类型事件类型有

    • START_DOCUMENT

      指出分析器处于文档的开头,并且还没有读取任何内容。

    • END_DOCUMENT

      xml文档的结尾

    • START_TAG

      开始读取标签

    • END_TAG

      读取到标签的结尾

    • TEXT

      字符数据被读取时

  • next()

    获取下一个解析事件

  • getName()

    对于 START_TAGEND_TAG 当前方法会返回读取当前元素的元素名

  • getAttributeCount()

    返回当前开始标记的属性数量,如果当前事件类型不是START_TAG,则返回-1

  • getAttributeName(int index)

    返回属性名称,超出范围会抛出IndexOutOfBoundsException

  • getAttributeValue(int index)

  • 返回属性的值,超出范围会抛出IndexOutOfBoundsException

  • getText()

    以String形式返回当前事件的文本内容

解析XML

  1. 获取 XmlPullParser 实例

    • 第一种方式:

      XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
      XmlPullParser parser = factory.newPullParser();
      复制代码
    • 第二种方式:

      XmlPullParser parser = Xml.newPullParser();
      复制代码
  2. 设置需要解析的 Xml 流

    String xmlString = "";
    InputStream is = new ByteArrayInputStream(xmlString.getBytes("UTF-8"));
    parser.setInput(is, "UTF-8");
    复制代码
  3. 处理事件直到读取到事件类型为 END_DOCUMENT

    while (eventType != XmlPullParser.END_DOCUMENT) {
        switch (eventType) {
            case XmlPullParser.START_DOCUMENT:
                break;
            case XmlPullParser.START_TAG:
                break;
            case XmlPullParser.END_TAG:
                break;
         }
         eventType = parser.next();
    }
    复制代码

生成

XmlSerializer 的核心方法

  • setOutput(OutputStream os, String encoding)

  • startDocument(String encoding, Boolean standalone)

  • startTag(String namespace, String name)

  • endTag(String nendamespace, String name)

  • attribute(String namespace, String name, String value)

  • text(String text)

  • endDocument()

生成XML

  1. 获取 XmlSerializer 实例

    XmlSerializer serializer = Xml.newSerializer();
    复制代码
  2. 设置输出流

    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    serializer.setOutput(outputStream, "UTF-8");
    复制代码
  3. 设置 Xml 文本

    serializer.startDocument("UTF-8", true);//设置文本开始
    serializer.startTag(null, "students");//设置开始标签
    serializer.endTag(null, "age");//设置结束标签
    serializer.attribute(null, "type", "number");//设置标签属性
    serializer.text("18");//设置标签文本
    复制代码

完整代码

    String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
            "\n" +
            "<students>\n" +//开始标签
            "  <student>\n" +//开始标签
            "    <name area=\"china\">qin</name>\n" +//前一个name为开始标签,后一个name为结束标签, area 为 attribute 的 name,china 为 attribute 的 value
            "    <age type=\"number\">18</age>\n" +
            "  </student>\n" +
            "  <student>\n" +
            "    <name area=\"china\">qin</name>\n" +
            "    <age type=\"number\">18</age>\n" +
            "  </student>\n" +
            "  <student>\n" +
            "    <name area=\"china\">qin</name>\n" +
            "    <age type=\"number\">18</age>\n" +
            "  </student>\n" +
            "</students>\n";

    /**
     * 生成xml
     */
    private String generateXml() {
        try {
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            XmlSerializer serializer = Xml.newSerializer();
            serializer.setOutput(outputStream, "UTF-8");
            serializer.startDocument("UTF-8", true);
            serializer.startTag(null, "students");
            for (int i = 0; i < 3; i++) {
                serializer.startTag(null, "student");
                serializer.startTag(null, "name");
                serializer.attribute(null, "area", "china");
                serializer.text("qin");
                serializer.endTag(null, "name");
                serializer.startTag(null, "age");
                serializer.attribute(null, "type", "number");
                serializer.text("18");
                serializer.endTag(null, "age");
                serializer.endTag(null, "student");
            }
            serializer.endTag(null, "students");
            serializer.endDocument();
            out.flush();
            out.close();

            return outputStream.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 解析xml
     */
    private void parseXml() {
        List<Student> students = null;
        Student student = null;
        try {
            InputStream is = new ByteArrayInputStream(xml.getBytes("UTF-8"));
            XmlPullParser parser = Xml.newPullParser();
            parser.setInput(is, "UTF-8");
            int eventType = parser.getEventType();
            while (eventType != XmlPullParser.END_DOCUMENT) {
                switch (eventType) {
                    case XmlPullParser.START_DOCUMENT:
                        students = new ArrayList<>();
                        break;
                    case XmlPullParser.START_TAG:
                        if ("student".equals(parser.getName())) {
                            student = new Student();
                        } else if ("name".equals(parser.getName())) {
                            if (student == null) {
                                return;
                            }
                            student.setName(parser.nextText());
                        } else if ("age".equals(parser.getName())) {
                            if (student == null) {
                                return;
                            }
                            student.setSex(Integer.parseInt(parser.nextText()));
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        if ("student".equals(parser.getName())) {
                            if (students == null) {
                                return;
                            }
                            if (student == null) {
                                return;
                            }
                            students.add(student);
                            student = null;
                        }
                        break;
                }
                eventType = parser.next();
            }
            Log.d(TAG, "parseXml: " + students);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

复制代码

参考

http://www.runoob.com/w3cnote/android-tutorial-xml.html

转载于:https://juejin.im/post/5ae87b0e6fb9a07a9e4d0358

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值