日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
XML的解析與生成

Android平臺(tái)上可以使用 Simple API for XML (SAX), Document Object Model(DOM) 和Android 附帶的pull解析器 解析XML文件

成都創(chuàng)新互聯(lián)公司自2013年創(chuàng)立以來,先為天心等服務(wù)建站,天心等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為天心企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

眾所周知,,DOM解析方式很耗內(nèi)存, 優(yōu)先使用SAX或者pull

SAX:

解析速度快,占用內(nèi)存少,采用事件驅(qū)動(dòng),即不需要加載完整個(gè)文檔,而是按內(nèi)容順序解析文檔,在此過程中,其會(huì)判斷當(dāng)前讀到的內(nèi)容是否符合XML語法定義,如果符合就會(huì)觸發(fā)事件,所謂事件,其實(shí)就是一些callback方法,具體方法含義比較簡(jiǎn)單, 看文檔即可,定義在DefaultHandler接口中(SAX已內(nèi)置到JDK5.0中)

待解析xml文件musics.xml:

  
 
 
  1.  
  2.  
  3.       
  4.       
  5.         黑色幽默  
  6.         Jay  
  7.         2000  
  8.       
  9.       
  10.       
  11.         愛在西元前  
  12.         范特西  
  13.         2001  
  14.       
  15.       
  16.       
  17.         回到過去  
  18.         八度空間  
  19.         2002  
  20.       
  21.       
  22.       
  23.         東風(fēng)破  
  24.         葉惠美  
  25.         2003  
  26.       
  27.       
  28.       
  29.         七里香  
  30.         七里香  
  31.         2004  
  32.       
  33.       
  34.       
  35.         一路向北  
  36.         十一月的蕭邦  
  37.         2005  
  38.        
  39.  

實(shí)體類MusicEntity就不貼了,四個(gè)屬性,上面的xml中也可以看出.

實(shí)現(xiàn)了DefaultHandler接口的SaxHandler:

  
 
 
  1. public class SaxHandler extends DefaultHandler{  
  2.     private static final String TAG = "lanyan";        
  3.     private List musics;        
  4.     private MusicEntity music;  
  5.     //緩存上一次的標(biāo)簽名  
  6.     private String preTag;        
  7.     @Override 
  8.     public void startDocument() throws SAXException {  
  9.         musics = new ArrayList();  
  10.     }     
  11.     @Override 
  12.     public void startElement(String uri, String localName, String qName,  
  13.             Attributes attributes) throws SAXException {            
  14.         if ("music".equals(localName)) {  
  15.             music = new MusicEntity();  
  16.             music.setId(Integer.parseInt(attributes.getValue("id")));  
  17.         }    
  18.         preTag = localName;  
  19.     }  
  20.       
  21.     /**  
  22.      * 解析到文檔中字符內(nèi)容時(shí)調(diào)用  
  23.      * 所以一般網(wǎng)絡(luò)中傳輸?shù)膞ml,其父節(jié)點(diǎn)與子節(jié)點(diǎn)之間是緊挨在一起的,基本上就是一行,看起來很混亂,其實(shí)是為了避免解析時(shí)無必要的調(diào)用  
  24.      * 這里僅是測(cè)試,故忽略這個(gè)因素  
  25.      */ 
  26.     @Override 
  27.     public void characters(char[] ch, int start, int length)  
  28.             throws SAXException {  
  29.           
  30.         if (null != music) {  
  31.             String str = new String(ch, start, length);  
  32.               
  33.             if ("name".equals(preTag)) {  
  34.                 music.setName(str);  
  35.             } else if ("albumName".equals(preTag)) {  
  36.                 music.setAlbumName(str);  
  37.             } else if ("year".equals(preTag)) {  
  38.                 music.setYear(Integer.parseInt(str));  
  39.             }  
  40.         }  
  41.           
  42.     }  
  43.       
  44.     @Override 
  45.     public void endElement(String uri, String localName, String qName)  
  46.             throws SAXException {  
  47.         if ("music".equals(localName) && null != music) {  
  48.             musics.add(music);  
  49.             music = null;  
  50.         }  
  51.         preTag = null;  
  52.     }  
  53.       
  54.     @Override 
  55.     public void endDocument() throws SAXException {  
  56.     }  
  57.       
  58.     public List getMusics() {  
  59.         return musics;  
  60.     }   

對(duì)外提供SAX解析服務(wù)的接口SaxService:

  
 
 
  1. public class SaxService {  
  2.     public static List readXml(InputStream is) throws Exception {  
  3.         SAXParserFactory saxFactory = SAXParserFactory.newInstance();  
  4.         SAXParser parser = saxFactory.newSAXParser();  
  5. //        parser.setProperty("http://xml.org/sax/features/namespaces", true);          
  6.         SaxHandler handler = new SaxHandler();  
  7.         parser.parse(is, handler);  
  8.         return handler.getMusics();  
  9.     }      

測(cè)試方法:

  
 
 
  1. public void testSaxRead() {  
  2.         InputStream is = XmlPaserTest.class.getClassLoader().getResourceAsStream("musics.xml");  
  3.         try {  
  4.             List musics = SaxService.readXml(is);  
  5.             for (MusicEntity music : musics) {  
  6.                 Log.i("lanyan", music.toString());  
  7.             }     
  8.         } catch (Exception e) {  
  9.             e.printStackTrace();  
  10.         }  
  11.     } 

Pull:

同樣是事件驅(qū)動(dòng),不同的是不需要實(shí)現(xiàn)什么handler接口,標(biāo)簽之間value的讀取也不需要通過類似characters(...)的回調(diào)方法,相關(guān)API已經(jīng)封轉(zhuǎn)好了

對(duì)外提供PULL解析服務(wù)的接口PullService中的xml解析方法:

  
 
 
  1. public static List readXml(InputStream is) throws Exception {  
  2.         List musics = null;  
  3.         XmlPullParser parser = Xml.newPullParser();  
  4.         parser.setInput(is, "UTF-8");  
  5.         int eventCode = parser.getEventType();// 事件類型  
  6.         MusicEntity music = null;  
  7.         while (eventCode != XmlPullParser.END_DOCUMENT) {  
  8.             switch (eventCode) {  
  9.             case XmlPullParser.START_DOCUMENT:// 開始文檔事件  
  10.                 musics = new ArrayList();  
  11.                 break;  
  12.             case XmlPullParser.START_TAG:// 元素開始標(biāo)志  
  13.                 if ("music".equals(parser.getName())) {  
  14.                     music = new MusicEntity();  
  15.                     music.setId(new Integer(parser.getAttributeValue(0)));  
  16.                 } else if (music != null) {  
  17.                     if ("name".equals(parser.getName())) {  
  18.                         music.setName(parser.nextText());// 拿到標(biāo)簽后***個(gè)文本節(jié)點(diǎn)的value  
  19.                     } else if ("albumName".equals(parser.getName())) {  
  20.                         music.setAlbumName(parser.nextText());  
  21.                     } else if ("year".equals(parser.getName())) {  
  22.                         music.setYear(Integer.parseInt(parser.nextText()));  
  23.                     }  
  24.                 }  
  25.                 break;  
  26.             case XmlPullParser.END_TAG://元素結(jié)束標(biāo)志  
  27.                 if ("music".equals(parser.getName()) && music != null) {  
  28.                     musics.add(music);  
  29.                     music = null;  
  30.                 }  
  31.                 break;  
  32.             }  
  33.             eventCode = parser.next();  
  34.         }  
  35.         return musics;  
  36.     } 

使用PULL解析方式生成xml文件:

PullService中的xml生成方法:

  
 
 
  1. /**  
  2.      * Pull生成xml數(shù)據(jù)  
  3.      * @param persons  
  4.      * @param writer  
  5.      * @throws Exception  
  6.      */  
  7.     public static void writeXml(List musics, Writer writer)  
  8.             throws Exception {  
  9.         XmlSerializer serializer = Xml.newSerializer();  
  10.         serializer.setOutput(writer);  
  11.         serializer.startDocument("UTF-8", true);  
  12.         serializer.startTag(null, "musics");  
  13.  
  14.         for (MusicEntity music : musics) {  
  15.             serializer.startTag(null, "music");  
  16.             serializer.attribute(null, "id", String.valueOf(music.getId()));  
  17.             serializer.startTag(null, "name");  
  18.             serializer.text(music.getName());  
  19.             serializer.endTag(null, "name");  
  20.             serializer.startTag(null, "albumName");  
  21.             serializer.text(music.getAlbumName());  
  22.             serializer.endTag(null, "albumName");  
  23.             serializer.startTag(null, "year");  
  24.             serializer.text(String.valueOf(music.getYear()));  
  25.             serializer.endTag(null, "year");  
  26.             serializer.endTag(null, "music");  
  27.         }  
  28.         serializer.endTag(null, "musics");  
  29.         serializer.endDocument();  
  30.         writer.flush();  
  31.         writer.close();  
  32.     } 

測(cè)試方法:

  
 
 
  1. public void testPullWrite() throws Exception {  
  2.         List musics = new ArrayList();  
  3.         MusicEntity music1 = new MusicEntity();  
  4.         music1.setId(1);  
  5.         music1.setName("七里香");  
  6.         music1.setAlbumName("七里香");  
  7.         music1.setYear(2004);  
  8.         musics.add(music1);  
  9.         MusicEntity music2 = new MusicEntity();  
  10.         music2.setId(1);  
  11.         music2.setName("一路向北");  
  12.         music2.setAlbumName("十一月的蕭邦");  
  13.         music2.setYear(2005);  
  14.         musics.add(music2);  
  15.         //寫入文件  
  16. //        File file = new File(Environment.getExternalStorageDirectory(), "musics.xml");  
  17. //        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));  
  18.         //以字符串形式輸出  
  19.         StringWriter writer = new StringWriter();  
  20.         PullService.writeXml(musics, writer);  
  21.         Log.i("lanyan", writer.toString());  
  22.     } 

輸出結(jié)果:

  
 
 
  1. 七里香七里香2004一路向北十一月的蕭邦2005 

名稱欄目:XML的解析與生成
鏈接分享:http://www.dlmjj.cn/article/cdiehjd.html