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();
      
  1. 设置需要解析的 Xml 流

    String xmlString = "";
    InputStream is = new ByteArrayInputStream(xmlString.getBytes("UTF-8"));
    parser.setInput(is, "UTF-8");
    
  2. 处理事件直到读取到事件类型为 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 = "\n" +
            "\n" +
            "\n" +//开始标签
            "  \n" +//开始标签
            "    qin\n" +//前一个name为开始标签,后一个name为结束标签, area 为 attribute 的 name,china 为 attribute 的 value
            "    18\n" +
            "  \n" +
            "  \n" +
            "    qin\n" +
            "    18\n" +
            "  \n" +
            "  \n" +
            "    qin\n" +
            "    18\n" +
            "  \n" +
            "\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 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

你可能感兴趣的:(Android XML 解析与生成)