android里面怎么解析xml

如题所述

Android解析xml文件总共有三种方法,分别是:

     SAX解析XML文件: SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。 SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。如下代码:


    public static List<Person> readXML(InputStream inStream) {
       try {
                //创建解析器
                SAXParserFactory spf = SAXParserFactory.newInstance();
                SAXParser saxParser = spf.newSAXParser();
     
                //设置解析器的相关特性,true表示开启命名空间特性
                saxParser.setProperty("http://xml.org/sax/features/namespaces",true);
                XMLContentHandler handler = new XMLContentHandler();
                saxParser.parse(inStream, handler);
                inStream.close();

                return handler.getPersons();
       } catch (Exception e) {
                e.printStackTrace();
       }

      return null;
    }

     
    //SAX类:DefaultHandler,它实现了ContentHandler接口。在实现的时候,只需要继承该类,重载相应的方法即可。
    public class XMLContentHandler extends DefaultHandler {

                private List<Person> persons = null;
                private Person currentPerson;
                private String tagName = null;//当前解析的元素标签

                 public List<Person> getPersons() {
                            return persons;
                }
     
                //接收文档开始的通知。当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。
                @Override
                public void startDocument() throws SAXException {
                            persons = new ArrayList<Person>();
                }

                 //接收元素开始的通知。当读到一个开始标签的时候,会触发这个方法。其中namespaceURI表示元素的命名空间;
                //localName表示元素的本地名称(不带前缀);qName表示元素的限定名(带前缀);atts è¡¨ç¤ºå…ƒç´ çš„属性集合
                @Override
                public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {

                            if(localName.equals("person")){
                                        currentPerson = new Person();
                                        currentPerson.setId(Integer.parseInt(atts.getValue("id")));
                            }

                            this.tagName = localName;
                }
     
                //接收字符数据的通知。该方法用来处理在XML文件中读到的内容,第一个参数用于存放文件的内容,
                //后面两个参数是读到的字符串在这个数组中的起始位置和长度,使用new String(ch,start,length)就可以获取内容。
                @Override
                public void characters(char[] ch, int start, int length) throws SAXException {

                            if(tagName!=null){
                                        String data = new String(ch, start, length);
                                        if(tagName.equals("name")){
                                                    this.currentPerson.setName(data);
                                        }else if(tagName.equals("age")){
                                                    this.currentPerson.setAge(Short.parseShort(data));
                                        }
                            }
                }

                 //接收文档的结尾的通知。在遇到结束标签的时候,调用这个方法。其中,uri表示元素的命名空间;
                //localName表示元素的本地名称(不带前缀);name表示元素的限定名(带前缀)
                @Override
                public void endElement(String uri, String localName, String name) throws SAXException {

                            if(localName.equals("person")){
                                        persons.add(currentPerson);
                                        currentPerson = null;
                            }

                            this.tagName = null;
                }
    }

    DOM解析XML文件:  DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据。使用DOM操作XML的代码看起来比较直观,并且,在某些方面比基于SAX的实现更加简单。但是,因为DOM需要将XML文件的所有内容读取到内存中,所以内存的消耗比较大,特别对于运行Android的移动设备来说,因为设备的资源比较宝贵,所以建议还是采用SAX来解析XML文件,当然,如果XML文件的内容比较小采用DOM是可行的。

    Pull解析器解析XML文件:    Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型元素的值

温馨提示:内容为网友见解,仅供参考
第1个回答  2016-03-13
XML在各种开发中都广泛应用,Android也不例外。作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能。今天就由我向大家介绍一下在Android平台下几种常见的XML解析和创建的方法。
在Android中,常见的XML解析器分别为SAX解析器、DOM解析器和PULL解析器,下面,我将一一向大家详细介绍。
SAX解析器:
SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。
SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用。
DOM解析器:
DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。
由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源。
PULL解析器:
PULL解析器的运行方式和SAX类似,都是基于事件的模式。不同的是,在PULL解析过程中,我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器。本回答被提问者采纳
第2个回答  2016-03-31
1、用InputStream读入文件
2、用DocumentBuilder对象将读入的Stream转换为Document对象,之后逐个获取Document对象中的所有Element节点即可
代码如下:
InputStream stream = null;
try {
stream = context.openFileInput(XML_NAME);
DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbfactory.newDocumentBuilder();
Document doc = builder.parse(stream);

Element rootElemet = doc.getDocumentElement();
NodeList nodeList = rootElemet.getChildNodes();

for(int i = 0;i < nodeList.getLength();i++){
if(nodeList.item(i) instanceof Element){
Element node = (Element)nodeList.item(i);
String nodeName = node.getNodeName(); /* 获取节点名*/
String name = node.getAttribute(ATTRIBUTE_NAME); /* 获取节点中指定属性信息 */
/* 获取各个子节点信息 */
NodeList childList = node.getChildNodes();
for (int j = 0; j < childList.getLength(); j++) {
if (childList.item(j) instanceof Element) {
Element child = (Element)childList.item(j);
String name = child.getAttribute("name");
String childValue = null;
if (child.getFirstChild() != null) {
childValue = child.getFirstChild().getNodeValue();
}
mParams.put(name, childValue);
}
}
if (NODE_NAME.equals(nodeName)) {
/* 针对此节点信息的处理 */
}
}
}
......
第3个回答  2016-04-10
Android中,常见的XML解析器有三种,SAX解析器、DOM解析器和PULL解析器。
第4个回答  2016-03-23
dom4j 专业解析XML 自己手动解析太麻烦
相似回答