Android提高第七篇之XML解析与生成

**解析XML文件,Android 内置了三种解析方案。


SAX解析XML


1. person.xml:

  

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   <persons>  
  3.        <person id="23">  
  4.               <name>wjh</name>  
  5.               <age>25</age>  
  6.        </person>  
  7.        <person id="20">  
  8.               <name>wjh2</name>  
  9.               <age>30</age>  
  10.        </person>  
  11.   </persons>  
 

 

2. Service:

 

  1. public class XMLParserService {  
  2.        public static List<Person> readXML(InputStream inStream) throws Exception {  
  3.               SAXParserFactory spf = SAXParserFactory.newInstance();  
  4.               SAXParser saxParser = spf.newSAXParser(); // 创建解析器  
  5.               // 设置解析器的相关特性,http://xml.org/sax/features/namespaces = true 表示开启命名空间特性  
  6.               //saxParser.setProperty("http://xml.org/sax/features/namespaces", true);  
  7.               XMLContentHandler handler = new XMLContentHandler();  
  8.               saxParser.parse(inStream, handler);  
  9.               inStream.close();  
  10.               return handler.getPersons();  
  11.        }  
  12.    
  13. }  
 

 

3. ContentHandler

 

  1. public class XMLContentHandler extends DefaultHandler {  
  2.    
  3.        private List<Person> persons;  
  4.        private Person person;  
  5.        private String preTag;  
  6.         
  7.        @Override  
  8.        public void characters(char[] ch, int start, int length)  
  9.                      throws SAXException {  
  10.               if(preTag != null) {  
  11.                      String data = new String(ch, start, length);  
  12.                      if("name".equals(preTag)) {  
  13.                             person.setName(data);  
  14.                      } else if("age".equals(preTag)) {  
  15.                             person.setAge(Short.valueOf(data));  
  16.                      }  
  17.               }  
  18.        }  
  19.    
  20.        @Override  
  21.        public void endElement(String uri, String localName, String qName)  
  22.                      throws SAXException {  
  23.               if("person".equals(localName) && person != null) {  
  24.                      persons.add(person);  
  25.               }  
  26.               preTag = null;  
  27.        }  
  28.    
  29.        @Override  
  30.        public void startDocument() throws SAXException {  
  31.               persons = new ArrayList<Person>();  
  32.        }  
  33.    
  34.        @Override  
  35.        public void startElement(String uri, String localName, String qName,  
  36.                      Attributes attributes) throws SAXException {  
  37.               if("person".equals(localName)) {  
  38.                       person = new Person();  
  39.                       person.setId(Integer.parseInt(attributes.getValue(0)));  
  40.               }  
  41.               preTag = localName;  
  42.        }  
  43.    
  44.        /** 
  45.         * 返回解析出的 Person 对象集合 
  46.         * @return 
  47.         */  
  48.        public List<Person> getPersons() {  
  49.               return persons;  
  50.        }  
  51. }  
  52.    
 


DOM 解析上例的 XML 示例 :

 

1. Service

  

  1. public class DOMService {  
  2.         
  3.        public static List<Person> readXML(InputStream inStream) throws Exception {  
  4.               List<Person> persons = new ArrayList<Person>();  
  5.               DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
  6.               DocumentBuilder builder = factory.newDocumentBuilder();  
  7.               Document dom = builder.parse(inStream);  
  8.                
  9.               Element root = dom.getDocumentElement();  
  10.               NodeList personNodes = root.getElementsByTagName("person");  
  11.                
  12.               for(int i=0; i < personNodes.getLength(); i++) {  
  13.                      Person person = new Person();  
  14.                      Element personNode = (Element) personNodes.item(i);  
  15.                       
  16.                      person.setId(Integer.parseInt(personNode.getAttribute("id")));  
  17.                       
  18.                      NodeList personChildList = personNode.getChildNodes();  
  19.                      for(int j=0; j<personChildList.getLength(); j++) {  
  20.                             Node node = personChildList.item(j);  
  21.                             if(node.getNodeType() == Node.ELEMENT_NODE) {  
  22.                                    Element element = (Element) node;  
  23.                                    if("name".equals(element.getNodeName())) {  
  24.                                           person.setName(element.getFirstChild().getNodeValue());  
  25.                                    } else if ("age".equals(element.getNodeName())) {  
  26.                                           person.setAge(Short.valueOf(element.getFirstChild().getNodeValue()));  
  27.                                    }  
  28.                             }  
  29.                      }  
  30.                       
  31.                      persons.add(person);  
  32.               }  
  33.               return persons;  
  34.        }  
  35. }  
 

  解析后返回解析的 Person 集合,任务完毕。

 

 

**Pull 解析上例的 XML 示例 (推荐):

  1. public static List<Person> readXML(InputStream is) throws Exception {  
  2.        List<Person> persons = null;  
  3.        Person person = null;  
  4.        XmlPullParser pullParser = Xml.newPullParser();  
  5.        pullParser.setInput(is, "UTF-8");  
  6.        int eventType = pullParser.getEventType(); // 触发第一个事件  
  7.    
  8.        while (eventType != XmlPullParser.END_DOCUMENT) { // 如果不为文档结束事件  
  9.               switch (eventType) {  
  10.               case XmlPullParser.START_DOCUMENT:  // 文档开始事件  
  11.                      persons = new ArrayList<Person>();  
  12.                      break;  
  13.               case XmlPullParser.START_TAG:   // 标签开始事件  
  14.                      if ("person".equals(pullParser.getName())) {  
  15.                             int id = Integer.parseInt(pullParser.getAttributeValue(0));  
  16.    
  17.                             person = new Person();  
  18.                             person.setId(id);  
  19.                      }  
  20.                      if (person != null) {  
  21.                             if ("name".equals(pullParser.getName())) {  // 读取到 name 标签  
  22.                                    person.setName(pullParser.nextText());  
  23.                             }  
  24.                             if ("age".equals(pullParser.getName())) {  // 读取到 age 标签  
  25.                                    person.setAge((Short.valueOf((pullParser.nextText()))));  
  26.                             }  
  27.                      }  
  28.                      break;  
  29.               case XmlPullParser.END_TAG:   // 标签结束事件  
  30.                      if ("person".equals(pullParser.getName())) {  
  31.                             persons.add(person);  
  32.                             person = null;  
  33.                      }  
  34.                      break;  
  35.               }  
  36.               eventType = pullParser.next();  
  37.        }  
  38.    
  39.        return persons;  
  40. }  
 

 

** Pull 解析器生成 XML 文件

  1. public static void save(List<Person> persons, OutputStream os) throws Exception {  
  2.               XmlSerializer serializer = Xml.newSerializer();  
  3.               serializer.setOutput(os, "UTF-8");  
  4.               // 第二个参数:此 XML 是否可独立存在  
  5.               serializer.startDocument("UTF-8", true);  
  6.               // 第一个参数:命名空间,无则为null  
  7.               serializer.startTag(null, "persons");  
  8.                
  9.               for(Person person : persons) {  
  10.                      serializer.startTag(null, "person");  
  11.                       
  12.                      serializer.attribute(null, "id", person.getId().toString());  
  13.                       
  14.                      serializer.startTag(null, "name");  
  15.                      serializer.text(person.getName());  
  16.                      serializer.endTag(null, "name");  
  17.                       
  18.                      serializer.startTag(null, "age");  
  19.                      serializer.text(person.getAge().toString());  
  20.                      serializer.endTag(null, "age");  
  21.                       
  22.                      serializer.endTag(null, "person");  
  23.               }  
  24.                
  25.               serializer.endTag(null, "persons");  
  26.               serializer.endDocument();  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值