Android Xml解析

来源:互联网 发布:淘宝店铺怎么改主营 编辑:程序博客网 时间:2024/06/05 09:01
 

学习Android的朋友欢迎加入:群 59324839(QQ)

XML文件解析

Xml文件解析

SAX(事件驱动)//1:Element Node  2:text Node

       <?xml version="1.0" encoding="UTF-8" ?> --(start document)--1

<persons>-------------------------------------(start Element)------2

<person>

<person id="23">

  <name>liming</name>

  <age>30</age>

  </person>

<person>

<person id="20">

  <name>lixiangmei</name>

  <age>25</age>

  </person>

  </persons>

 

说明:事件驱动---流式处理

         1:startDocutment();

                   当遇到文档的开头的时候调用这个方法,可以在其中做一些预处理的工作

         2:endDocument();

                   和1想对应,在其中可以做一些善后的处理

         3:startElement(String namespaceURI, String localName, String qName, Attributes atts)

            namespaceURI命名空间(如:<jsp:include>中的jsp)

            localName不带命名空间的前缀标签名  (如:<jsp:include>中的include)

            qName: 带命名空间的前缀标签名  (如:<jsp:include>中的jsp:include)

            atts可以通过其得到所有属性与值

         4:endElements(String url, String localName, String name)

            与3对应,不同的是在结束标签的时候进行调用

         5:characters(char[] ch, int start, int length)—文本Node事件

                   用于处理在xml文件中读到的内容,第一个参数为文件的字符串内容,后面两个参数是读到的字符串在这个数组的起始位置和长度,使用newString(ch,start,length)就可以得到内容

 

实现步骤:

         1:SAXParserFactory factory = SAXParserFactory.newInstance();

            SAXParser parser = factory.newSAXParser();

                   Parser.parse(inputStream,handler);

 

         2实现handler

                   步骤:

                            1:extends DefaultHandler(list tag)

                                     重写:[1]characters [2]startDoucment [3]startElement [4]endElement

 

DOM(文件树—内存消耗大)

         优点:xml代码直观,

<?xml version="1.0" encoding="UTF-8" ?> --(start document)--1

<persons>-------------------------------------(start Element)------2

<person>

<person id="23">

  <name>liming</name>

  <age>30</age>

  </person>

<person>

<person id="20">

  <name>lixiangmei</name>

  <age>25</age>

  </person>

  </persons>

实现步骤:

         1:public static List<Person> getPersons(InputStream inStream) throws Throwable{

                   List<Person> persons = new ArrayList<Person>();

                   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

                   DocumentBuilder builder = factory.newDocumentBuilder();

                   Document documnet = builder.parse(inStream);

                   Element root = documnet.getDocumentElement();

                   NodeList personNodes = root.getElementsByTagName("person");

                   for(int i=0 ; i < personNodes.getLength(); i++){

                            Person person = new Person();

                            Element personElement = (Element)personNodes.item(i);

                            person.setId(new Integer(personElement.getAttribute("id")));

                            NodeList personChilds = personElement.getChildNodes();

                            for(int y=0 ; y < personChilds.getLength(); y++){

                                     if(personChilds.item(y).getNodeType()==Node.ELEMENT_NODE){//判断当前节点是否是元素类型节点

                                               Element childElement = (Element)personChilds.item(y);

                                               if("name".equals(childElement.getNodeName())){

                                                        person.setName(childElement.getFirstChild().getNodeValue());

                                               }else if("age".equals(childElement.getNodeName())){

person.setAge(new Short(childElement.getFirstChild().getNodeValue()));

                                               }

                                     }

                            }

                            persons.add(person);

                   }

                   return persons;

         }

 

PULL解析

                  public static List<Person> getPersons(InputStream inStream) throws Throwable{

                   List<Person> persons = null;

                   Person person = null;

                   XmlPullParser parser = Xml.newPullParser();

                   parser.setInput(inStream, "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:

                                     String name = parser.getName();//获取解析器当前指向的元素的名称

                                     if("person".equals(name)){

                                               person = new Person();

                                               person.setId(new Integer(parser.getAttributeValue(0)));

                                     }

                                     if(person!=null){

                                               if("name".equals(name)){

                                                        person.setName(parser.nextText());//获取解析器当前指向元素的下一个文本节点的值

                                               }

                                               if("age".equals(name)){

                                                        person.setAge(new Short(parser.nextText()));

                                               }

                                     }

                                     break;

                                    

                            case XmlPullParser.END_TAG:

                                     if("person".equals(parser.getName())){

                                               persons.add(person);

                                               person = null;

                                     }

                                     break;

                            }

                            eventType = parser.next();

                   }

                   return persons;

         }

Xml文件解析总结:

         SAX:(通过相关Factory得到);

                   如:parser对象

                   Parser.Parser(InStream,DefaultHandler);

其中最为主要的就是这个DefaultHandler;我们通过一个内部类(由于android考虑的内存方面的问题,所以一般使用内部类)进行实现;

其中重写一下几个方法:

         1:startElement()  endElement()  startDocument()  Characters()

         2:然后就是不同的事件进行不同的处理

 

         PULL(直接通过Xml得到对象):parser为解析对象;主要得到一个EventType():事件类型

                   根据这个时间类型在最后做循环:Tag = parser.next();

         元素操作:1:得到节点名—parser.getName();

                            2:得到节点内容(Text)parser.nextText();

                            3:得到节点中属性的值:parser.getAttributeValue(index);

原创粉丝点击