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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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