Android XML文件读取解析三种方式

1.DOM解析

DOM方式解析xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据的,但是这样一来,如果xml文件很大呢?手机CPU处理能力当然不能与PC机器比,因此在处理性能上会有折损。所以如果XML文件比较大,建议还是用下面两种方式,而不用DOM方式。

DOM解析的步骤一般如下:

1.构建一个DocumentBuilderFactory实例
2.构建DocumentBuilder
3.加载XML文档(Document)
4.遍历XML文档

 private List<Person> parseByDomParser()
            throws ParserConfigurationException, SAXException, IOException {
        List<Person> resList = new ArrayList<Person>();

        // 构建一个DocumentBuilderFactory实例
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 构建DocumentBuilder
        DocumentBuilder builder = factory.newDocumentBuilder();
        // 读取文件流
       AssetManager assetManager=getAssets();
        InputStream stream=assetManager.open("customers.xml");
        //InputStream stream = getResources().openRawResource(R.raw.customers);
        // 得到代表整个xml的Document对象
        Document document = builder.parse(stream);

        // 遍历所有节点
        Element root = document.getDocumentElement();
        // 获取根节点的所有customer的节点
        NodeList nodes = root.getElementsByTagName("customer");

        for (int index = 0; index < nodes.getLength(); index++) {
            Person person = new Person();
            // 获取person元素节点
            Element personElement = (Element) (nodes.item(index));
            // 获取person中属性(Attributes)值
            person.setName(personElement.getAttribute("name"));
            person.setAge(Integer.parseInt(personElement.getAttribute("age")));
            person.setSex(personElement.getAttribute("gender"));

            // 获取telphone下标签
            Element telphoneElement = (Element) personElement
                    .getElementsByTagName("telphone").item(0);
            NodeList phoneNodes = telphoneElement.getElementsByTagName("phone");
            for (int pIndex = 0; pIndex < phoneNodes.getLength(); pIndex++) {
                // 获取phone元素节点
                Element phoneElement = (Element) (phoneNodes.item(pIndex));
                person.addPhone(phoneElement.getFirstChild().getNodeValue());
            }
            // 获取email下标签
            Element emailElement = (Element) personElement
                    .getElementsByTagName("email").item(0);
            person.setEmail(emailElement.getFirstChild().getNodeValue());

            resList.add(person);
        }
        return resList;
    }

2.Pull方式解析

Pull解析采用的是事件驱动的方式来解析XML文档,当我们开始解析后,我们可以通过调用XmlResourceParser.next()解析下一个解析事件(开始文档,结束文档,开始标签,结束标签)。当我们解析到某一个元素是我们可以通过XmlPullParser.getAttributte()方法来获取属性的值,也可调用它的XmlPullParser.nextText()获取本节点的值.

private List<Person> parseByXmlPullParser() {
        List<Person> resultsList = new ArrayList<Person>();
        Person person = null;

        Resources resources = getResources();
        XmlResourceParser xrParser = resources.getXml(R.xml.customers);
        try {
            while (xrParser.getEventType() != XmlResourceParser.END_DOCUMENT) {
                if (xrParser.getEventType() == XmlResourceParser.START_TAG) {
                    String name = xrParser.getName();
                    if (name.equals("customer")) {
                        person = new Person();
                        person.setName(xrParser.getAttributeValue(null, "name"));
                        person.setAge(Integer.parseInt(xrParser
                                .getAttributeValue(1)));
                        person.setSex(xrParser.getAttributeValue(2));

                    } else if (name.equals("phone")) {
                        person.addPhone(xrParser.nextText());
                    } else if (name.equals("email")) {
                        xrParser.next();
                        person.setEmail(xrParser.getText());
                    }
                } else if (xrParser.getEventType() == XmlPullParser.END_TAG) {
                    String name = xrParser.getName();
                    if (name.equals("customer")) {
                        resultsList.add(person);
                    }
                }

                xrParser.next();
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return resultsList;
    }

3.SAX解析

SAX即是:Simple API for XML。SAX解析也是一种基于事件驱动的API,有两个部分,解析器和事件处理器,解析器就是XMLReader接口,负责读取XML文档和向事件处理器发送事件(也是事件源),事件处理器接口,负责对发送的事件响应和进行XML文档处理。

事件处理器有4个接口:

1.EntityResolver
2.DTDHandler
3.ContentHandler
4.ErrorHandler

解析器通过其setXXX()方法来注册事件处理器,在我们自己的解析中,我们不需要实现上述的事件处理器接口,因为SAX已经为我们提供了一个默认的基类DefaultHandler,我们只需要extend这个接口来实现我们的解析逻辑既可。

用SAX解析需要如下的几个步骤:

1:构建SAXParserFactory对象
2: 构建SAXParser解析器:根据SAXParserFactory.newSAXParser()方法返回一个SAXParser解析器
3:构建XMLReader:根据SAXParser解析器获取事件源对象XMLReader
4:构建一个自定义的Handler对象
5:连接事件源对象XMLReader到事件处理类DefaultHandler中
6:读取文件流
7:调用XMLReader的parse方法从输入源中获取到的xml数据
8:通过我们自定义的Handler返回我们需要的数据集合。

private List<Person> parseBySaxParser()
            throws ParserConfigurationException, SAXException, IOException {
        // 1.构建一个工厂SAXParserFactory
        SAXParserFactory parserFactory = SAXParserFactory.newInstance();
        // 2.构建并实例化SAXPraser对象
        SAXParser saxParser = parserFactory.newSAXParser();
        // 3.构建XMLReader解析器
        XMLReader xmlReader = saxParser.getXMLReader();
        // 4.这里是我们的具体类型的Handler对象
        PersonSaxParserHandler parserHandler = new PersonSaxParserHandler();
        // 5.解析器注册一个处理器
        xmlReader.setContentHandler(parserHandler);
        // 6.读取文件流
        InputStream stream = getResources().openRawResource(R.raw.customers);
        InputSource is = new InputSource(stream);
        // 6.解析文件
        xmlReader.parse(is);
        List<Person> resList = parserHandler.getPersons();
        return resList;
    }

public class PersonSaxParserHandler extends DefaultHandler {
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
    }
    @Override
    public void startDocument() throws SAXException {
        // 文档解析开始
        super.startDocument();
    }
    @Override
    public void endDocument() throws SAXException {
        // 文档解析开始
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // 开始解析节点
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        // 解析节点结束
    }
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木子庆五

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值