您的位置:

Android XML解析

一、XML简介

XML,全称为可扩展标记语言,是一种可用于标记各种数据的标记语言,它和HTML类似,但XML更加通用化、灵活。

Android应用程序中的UI界面元素、应用程序数据、网络请求等许多方面都需要用到XML。同时,由于XML的通用性,各种编程语言的数据也可以用XML描述和传输,从而实现跨语言开发。

XML的解析可以分为两种:DOM(文档对象模型)解析和SAX(Simple API for XML)解析。DOM解析将整个XML文档都读入内存中,然后解析,因此适合处理较小的XML文档。而SAX解析则是一种基于事件的解析方式,它只处理所需的XML数据,较为高效,适合处理大型XML文档。

二、DOM解析XML

DOM解析通常用于处理较小的XML文件。它将整个XML文档读入内存中,形成一颗树形结构。在解析过程中,程序可以轻易地遍历这个树形结构,找到XML节点,进行读取或修改。

下面是一个DOM解析XML的示例。我们通过读取一个电影列表XML文件,将其中的电影信息输出到控制台。


public void parseXmlWithDom() {
    try {
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = builderFactory.newDocumentBuilder();
        InputStream inputStream = getResources().openRawResource(R.raw.movies);
        Document document = builder.parse(inputStream);
        Element rootElement = document.getDocumentElement();
        NodeList movieList = rootElement.getElementsByTagName("movie");
        for (int i = 0; i < movieList.getLength(); i++) {
            Node movieNode = movieList.item(i);
            if (movieNode.getNodeType() == Node.ELEMENT_NODE) {
                Element movieElement = (Element) movieNode;
                String title = movieElement.getElementsByTagName("title").item(0).getTextContent();
                String year = movieElement.getElementsByTagName("year").item(0).getTextContent();
                String director = movieElement.getElementsByTagName("director").item(0).getTextContent();
                Log.d(TAG, "Title: " + title);
                Log.d(TAG, "Year: " + year);
                Log.d(TAG, "Director: " + director);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

三、SAX解析XML

SAX解析是一种基于事件的解析方式。解析器在读取XML文档的过程中,会触发一些事件,程序员可以根据需要实现这些事件的处理方法,完成对XML文档的解析。

下面是一个SAX解析XML的示例。我们通过读取一个学生列表XML文件,将其中的学生信息输出到控制台。


public void parseXmlWithSax() {
    try {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        InputStream inputStream = getResources().openRawResource(R.raw.students);
        parser.parse(inputStream, new DefaultHandler() {
            private String tagName;

            @Override
            public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
                super.startElement(uri, localName, qName, attributes);
                tagName = qName;
            }

            @Override
            public void endElement(String uri, String localName, String qName) throws SAXException {
                super.endElement(uri, localName, qName);
                tagName = null;
            }

            @Override
            public void characters(char[] ch, int start, int length) throws SAXException {
                super.characters(ch, start, length);
                String data = new String(ch, start, length);
                if (tagName != null && tagName.equals("name")) {
                    Log.d(TAG, "Name: " + data);
                } else if (tagName != null && tagName.equals("age")) {
                    Log.d(TAG, "Age: " + data);
                } else if (tagName != null && tagName.equals("gender")) {
                    Log.d(TAG, "Gender: " + data);
                }
            }
        });
    } catch (Exception e) {
        e.printStackTrace();
    }
}

四、XPath解析XML

XPath是一种查询XML文档的语言,它可以通过路径表达式来定位XML节点。XPath适用于DOM解析方式,效率较高。

下面是一个XPath解析XML的示例。我们通过读取一个手机列表XML文件,使用XPath表达式查询出其中价格大于1000的手机信息,并输出到控制台。


public void parseXmlWithXPath() {
    try {
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = builderFactory.newDocumentBuilder();
        InputStream inputStream = getResources().openRawResource(R.raw.phones);
        Document document = builder.parse(inputStream);
        XPathFactory xPathFactory = XPathFactory.newInstance();
        XPath xPath = xPathFactory.newXPath();
        String expression = "//phone[price>1000]";
        NodeList nodeList = (NodeList) xPath.evaluate(expression, document, XPathConstants.NODESET);
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node phoneNode = nodeList.item(i);
            if (phoneNode.getNodeType() == Node.ELEMENT_NODE) {
                Element phoneElement = (Element) phoneNode;
                String name = phoneElement.getElementsByTagName("name").item(0).getTextContent();
                String price = phoneElement.getElementsByTagName("price").item(0).getTextContent();
                Log.d(TAG, "Name: " + name);
                Log.d(TAG, "Price: " + price);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

五、总结

Android中XML的解析方式主要有DOM、SAX和XPath三种。DOM解析将整个XML文档都读入内存中,SAX解析则是一种基于事件的解析方式,XPath是一种查询XML文档的语言。我们可以根据具体情况选择不同的解析方式,在保证功能实现的前提下,提高程序效率和性能。