[置顶] android XML解析

发布时间:2017-2-27 3:27:57 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"[置顶] android XML解析",主要涉及到[置顶] android XML解析方面的内容,对于[置顶] android XML解析感兴趣的同学可以参考一下。

                               XML操作 1、使用sax方式解析      这种方式解析是一种基于事件驱动的api,有两个部分,解析器和事件处理器,解析器就是XMLReader接口,负责读取XML文档,和向事件处理器发送事件(也是事件源),事件处理器ContentHandler接口,负责对发送的事件响应和进行XML文档处理。      下面是ContentHandler接口的常用方法      public abstract void characters (char[] ch, int start, int length)      这个方法来接收字符块通知,解析器通过这个方法来报告字符数据块,解析器为了提高解析效率把读到的所有字符串放到一个字符数组(ch)中,作为参数传递给character的方法中,如果想获取本次事件中读取到的字符数据,需要使用start和length属性。     public abstract void startDocument () 接收文档开始的通知      public abstract void endDocument () 接收文档结束的通知      public abstract void startElement (String uri, String localName, String qName, Attributes atts) 接收文档开始的标签     public abstract void endElement (String uri, String localName, String qName) 接收文档结束的标签     在一般使用中为了简化开发,在org.xml.sax.helpers提供了一个DefaultHandler类,它实现了ContentHandler的方法,我们只想继承DefaultHandler方法即可。    另外SAX解析器提供了一个工厂类:SAXParserFactory,SAX的解析类为SAXParser 可以调用它的parser方法进行解析。 代码: 1) public class SAXPraserHelper extends DefaultHandler {     final int ITEM = 0x0005;     List<channel> list;     channel chann;     int currentState = 0;     public List<channel> getList() {         return list;     }     // 接口字符块通知     @Override     public void characters(char[] ch, int start, int length)             throws SAXException {             String theString = String.valueOf(ch, start, length);         if (currentState != 0) {             chann.setName(theString);             currentState = 0;         }         return;     }    // 接收文档结束通知     @Override     public void endDocument() throws SAXException {            super.endDocument();     }       // 接收标签结束通知     @Override     public void endElement(String uri, String localName, String qName)             throws SAXException {           if (localName.equals("item"))             list.add(chann);     }    // 文档开始通知     @Override     public void startDocument() throws SAXException {             list = new ArrayList<channel>();     }     // 标签开始通知     @Override     public void startElement(String uri, String localName, String qName,             Attributes attributes) throws SAXException {         chann = new channel();         if (localName.equals("item")) {             for (int i = 0; i < attributes.getLength(); i++) {                 if (attributes.getLocalName(i).equals("id")) {                     chann.setId(attributes.getValue(i));                 } else if (attributes.getLocalName(i).equals("url")) {                     chann.setUrl(attributes.getValue(i));                 }             }             currentState = ITEM;             return;         }   2) private List<channel> getChannelList() throws ParserConfigurationException, SAXException, IOException     {         //实例化一个SAXParserFactory对象         SAXParserFactory factory=SAXParserFactory.newInstance();         SAXParser parser;         //实例化SAXParser对象,创建XMLReader对象,解析器         parser=factory.newSAXParser();         XMLReader xmlReader=parser.getXMLReader();         //实例化handler,事件处理器         SAXPraserHelper helperHandler=new SAXPraserHelper();         //解析器注册事件         xmlReader.setContentHandler(helperHandler);         //读取文件流         InputStream stream=getResources().openRawResource(R.raw.channels);         InputSource is=new InputSource(stream);         //解析文件         xmlReader.parse(is);         return helperHandler.getList(); } 从第二部分代码,可以看出使用SAX解析XML的步骤: 1、实例化一个工厂SAXParserFactory 2、实例化SAXPraser对象,创建XMLReader 解析器 3、实例化handler,处理器 4、解析器注册一个事件 4、读取文件流 5、解析文件 2、使用Dom方式解析       在Dom解析的过程中,是先把dom全部文件读入到内存中,然后使用dom的api遍历所有数据,检索想要的数据,这种方式显然是一种比较消耗内存的方式,对于像手机这样的移动设备来讲,内存是非常有限的,所以对于比较大的XML文件,不推荐使用这种方式,但是Dom也有它的优点,它比较直观,在一些方面比SAX方式比较简单。在xml文档比较小的情况下也可以考虑使用dom方式。 Dom方式解析的核心代码如下: public static List<channel> getChannelList(InputStream stream)     {         List<channel> list=new ArrayList<channel>();         //得到 DocumentBuilderFactory 对象, 由该对象可以得到 DocumentBuilder 对象         DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();         try {             //得到DocumentBuilder对象             DocumentBuilder builder=factory.newDocumentBuilder();             //得到代表整个xml的Document对象             Document document=builder.parse(stream);             //得到 "根节点"             Element root=document.getDocumentElement();             //获取根节点的所有items的节点             NodeList items=root.getElementsByTagName("item");              //遍历所有节点             for(int i=0;i<items.getLength();i++)             {                 channel chann=new channel();                 Element item=(Element)items.item(i);                 chann.setId(item.getAttribute("id"));                 chann.setUrl(item.getAttribute("url"));                 chann.setName(item.getFirstChild().getNodeValue());                 list.add(chann);             }        } catch (ParserConfigurationException e) {             // TODO Auto-generated catch block             e.printStackTrace();         } catch (SAXException e) {             // TODO Auto-generated catch block             e.printStackTrace();         } catch (IOException e) {             // TODO Auto-generated catch block             e.printStackTrace();         }         return list; } 总结一下Dom解析的步骤(和sax类似) 1、调用 DocumentBuilderFactory.newInstance() 方法得到 DOM 解析器工厂类实例。 2、调用解析器工厂实例类的 newDocumentBuilder() 方法得到 DOM 解析器对象 3、调用 DOM 解析器对象的 parse() 方法解析 XML 文档得到代表整个文档的 Document 对象。   3、Dom4j方式 1)Dom4j概述 org.dom4j包,不仅包含创建xml的构建器类DocumentHelper、Element,而且还包含解析xml的解析器SAXReader、Element,包含类如下: org.dom4j org.dom4j.DocumentHelper; org.dom4j.Element; org.dom4j.io.SAXReader; org.dom4j.io.XMLWriter; org.dom4j.DocumentException;   2)Dom4j 创建 XML Dom4j,创建xml主要用到了org.dom4j.DocumentHelper、org.dom4j.Document、org.dom4j.io.OutputFormat、org.dom4j.io.XMLWriter 首先,DocumentHelper.createDocument(),创建 org.dom4j.Document 的实例 doc 接着,通过doc,设置xml属性doc.setXMLEncoding("utf-8")、doc.addElement("root")根节点,以及子节点等 然后,定义xml格式并输出,new XMLWriter(xmlWriter, outputFormat) 代码: /** Dom4j方式,创建 XML  */  public String dom4jXMLCreate(){       StringWriter xmlWriter = new StringWriter();      Person []persons = new Person[3];//创建节点Person对象        persons[0] = new Person(1, "sunboy_2050", "http://blog.csdn.net/sunboy_2050");       persons[1] = new Person(2, "baidu", "http://www.baidu.com");       persons[2] = new Person(3, "google", "http://www.google.com");     try {           org.dom4j.Document doc = DocumentHelper.createDocument();                           doc.setXMLEncoding("utf-8");                     org.dom4j.Element eleRoot = doc.addElement("root");       eleRoot.addAttribute("author", "homer");          eleRoot.addAttribute("date", "2012-04-25");           eleRoot.addComment("dom4j test");                     int personsLen = persons.length;           for(int i=0; i<personsLen; i++){                            Element elePerson = eleRoot.addElement("person");   // 创建person节点,引用类为 org.dom4j.Element                              Element eleId = elePerson.addElement("id");               eleId.addText(persons[i].getId()+"");                          Element eleName = elePerson.addElement("name");               eleName.addText(persons[i].getName());               Element eleBlog = elePerson.addElement("blog");   eleBlog.addText(persons[i].getBlog());           }             org.dom4j.io.OutputFormat outputFormat = new org.dom4j.io.OutputFormat();   // 设置xml输出格式            outputFormat.setEncoding("utf-8");           outputFormat.setIndent(false);           outputFormat.setNewlines(true);           outputFormat.setTrimText(true);                     org.dom4j.io.XMLWriter output = new XMLWriter(xmlWriter, outputFormat);     // 保存xml            output.write(doc);           output.close();       } catch (Exception e) {          e.printStackTrace();      }            savedXML(fileName, xmlWriter.toString());       return xmlWriter.toString();  }      /** Dom4j方式,创建 XML  */   public String dom4jXMLCreate(){     StringWriter xmlWriter = new StringWriter();       Person []persons = new Person[3];    // 创建节点Person对象     persons[0] = new Person(1, "sunboy_2050", "http://blog.csdn.net/sunboy_2050");     persons[1] = new Person(2, "baidu", "http://www.baidu.com");     persons[2] = new Person(3, "google", "http://www.google.com");         try {       org.dom4j.Document doc = DocumentHelper.createDocument();             doc.setXMLEncoding("utf-8");             org.dom4j.Element eleRoot = doc.addElement("root");       eleRoot.addAttribute("author", "homer");       eleRoot.addAttribute("date", "2012-04-25");       eleRoot.addComment("dom4j test");             int personsLen = persons.length;       for(int i=0; i<personsLen; i++){                   Element elePerson = eleRoot.addElement("person");  // 创建person节点,引用类为 org.dom4j.Element                   Element eleId = elePerson.addElement("id");          eleId.addText(persons[i].getId()+"");                   Element eleName = elePerson.addElement("name");          eleName.addText(persons[i].getName());                   Element eleBlog = elePerson.addElement("blog");          eleBlog.addText(persons[i].getBlog());       }         org.dom4j.io.OutputFormat outputFormat = new org.dom4j.io.OutputFormat();  // 设置xml输出格式       outputFormat.setEncoding("utf-8");       outputFormat.setIndent(false);       outputFormat.setNewlines(true);       outputFormat.setTrimText(true);             org.dom4j.io.XMLWriter output = new XMLWriter(xmlWriter, outputFormat);    // 保存xml       output.write(doc);       output.close();     } catch (Exception e) {       e.printStackTrace();     }         savedXML(fileName, xmlWriter.toString());     return xmlWriter.toString();   } 3、Dom4j 解析 XML         Dom4j,解析xml主要用到了org.dom4j.io.SAXReader、org.dom4j.Document、doc.getRootElement(),以及ele.getName()、ele.getText()等   首先,创建SAXReader的实例reader,读入xml字节流 reader.read(is) 接着,通过doc.getRootElement()得到root根节点,利用迭代器取得root下一级的子节点eleRoot.elementIterator()等 然后,得到解析的xml内容xmlWriter.append(xmlHeader)、xmlWriter.append(personsList.get(i).toString())   解析一:标准解析(Iterator 迭代) Code        /** Dom4j方式,解析 XML  */         public String dom4jXMLResolve(){             StringWriter xmlWriter = new StringWriter();                          InputStream is = readXML(fileName);             try {                 SAXReader reader = new SAXReader();                 org.dom4j.Document doc = reader.read(is);                          List<Person> personsList = null;                 Person person = null;                 StringBuffer xmlHeader = new StringBuffer();                                                   Element eleRoot = doc.getRootElement();     // 获得root根节点,引用类为 org.dom4j.Element                  String attrAuthor = eleRoot.attributeValue("author");                 String attrDate = eleRoot.attributeValue("date");                 xmlHeader.append("root").append("\t\t");                 xmlHeader.append(attrAuthor).append("\t");                 xmlHeader.append(attrDate).append("\n");                 personsList = new ArrayList<Person>();                                  // 获取root子节点,即person                  Iterator<Element> iter = eleRoot.elementIterator();                 for(; iter.hasNext(); ) {                     Element elePerson = (Element)iter.next();                                          if("person".equals(elePerson.getName())){                         person = new Person();                                                  // 获取person子节点,即id、name、blog                          Iterator<Element> innerIter = elePerson.elementIterator();  .                      for(; innerIter.hasNext();) {                             Element ele = (Element)innerIter.next();                                                          if("id".equals(ele.getName())) {                                 String id = ele.getText();                                 person.setId(Integer.parseInt(id));                             } else if("name".equals(ele.getName())) {                                 String name = ele.getText();                                 person.setName(name);                             } else if("blog".equals(ele.getName())) {                                 String blog = ele.getText();                                 person.setBlog(blog);                             }                         }                                                  personsList.add(person);                         person = null;                     }                 }                                  xmlWriter.append(xmlHeader);                 int personsLen = personsList.size();                 for(int i=0; i<personsLen; i++) {                     xmlWriter.append(personsList.get(i).toString());                 }                              } catch (DocumentException e) {                 e.printStackTrace();             } catch (Exception e) {                 e.printStackTrace();             }                          return xmlWriter.toString();         }    /** Dom4j方式,解析 XML  */   public String dom4jXMLResolve(){    StringWriter xmlWriter = new StringWriter();       InputStream is = readXML(fileName);    try {      SAXReader reader = new SAXReader();      org.dom4j.Document doc = reader.read(is);        List<Person> personsList = null;      Person person = null;      StringBuffer xmlHeader = new StringBuffer();                Element eleRoot = doc.getRootElement();   // 获得root根节点,引用类为 org.dom4j.Element      String attrAuthor = eleRoot.attributeValue("author");      String attrDate = eleRoot.attributeValue("date");      xmlHeader.append("root").append("\t\t");      xmlHeader.append(attrAuthor).append("\t");      xmlHeader.append(attrDate).append("\n");      personsList = new ArrayList<Person>();           // 获取root子节点,即person      Iterator<Element> iter = eleRoot.elementIterator();      for(; iter.hasNext(); ) {       Element elePerson = (Element)iter.next();             if("person".equals(elePerson.getName())){         person = new Person();                 // 获取person子节点,即id、name、blog         Iterator<Element> innerIter = elePerson.elementIterator();         for(; innerIter.hasNext();) {          Element ele = (Element)innerIter.next();                   if("id".equals(ele.getName())) {            String id = ele.getText();            person.setId(Integer.parseInt(id));          } else if("name".equals(ele.getName())) {            String name = ele.getText();            person.setName(name);          } else if("blog".equals(ele.getName())) {            String blog = ele.getText();            person.setBlog(blog);          }         }                 personsList.add(person);         person = null;       }      }           xmlWriter.append(xmlHeader);      int personsLen = personsList.size();      for(int i=0; i<personsLen; i++) {       xmlWriter.append(personsList.get(i).toString());      }         } catch (DocumentException e) {      e.printStackTrace();    } catch (Exception e) {      e.printStackTrace();    }       return xmlWriter.toString();   }    

上一篇:Spring中的JDBCTemplate使用(非常详细的配置过程)
下一篇:daemon与service

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。