惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
F
Full Disclosure
月光博客
月光博客
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
T
Tailwind CSS Blog
Microsoft Security Blog
Microsoft Security Blog
N
Netflix TechBlog - Medium
The Register - Security
The Register - Security
aimingoo的专栏
aimingoo的专栏
The GitHub Blog
The GitHub Blog
D
Docker
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
I
InfoQ
腾讯CDC
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
K
Kaspersky official blog
Hugging Face - Blog
Hugging Face - Blog
D
DataBreaches.Net
P
Proofpoint News Feed
Cisco Talos Blog
Cisco Talos Blog
NISL@THU
NISL@THU
有赞技术团队
有赞技术团队
P
Proofpoint News Feed
美团技术团队
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Martin Fowler
Martin Fowler
L
Lohrmann on Cybersecurity
Know Your Adversary
Know Your Adversary
Simon Willison's Weblog
Simon Willison's Weblog
S
Securelist
T
Threatpost
云风的 BLOG
云风的 BLOG
G
Google Developers Blog
L
LangChain Blog
Blog — PlanetScale
Blog — PlanetScale
Recorded Future
Recorded Future
C
Cisco Blogs
S
SegmentFault 最新的问题
Cyberwarzone
Cyberwarzone
GbyAI
GbyAI
IT之家
IT之家
S
Schneier on Security
L
LINUX DO - 热门话题
T
Tenable Blog
T
The Exploit Database - CXSecurity.com
MyScale Blog
MyScale Blog
P
Privacy & Cybersecurity Law Blog
Google Online Security Blog
Google Online Security Blog
T
Threat Research - Cisco Blogs

博客园 - 生如夏花之灿烂

本人讲课时录制的Android应用开发技术教学视频 jsoup使用样式class抓取数据时空格的处理 我的第一款anroid软件作品--短信精灵1.0 (原创)Android入门教程(三十六)------实现手机联系人的全选 Android入门教程(三十五)------在Android上使用ZXing识别条形码/二维码(转) Android入门教程(三十四)------之多级树形菜单的实现 (转) Android入门教程(三十三)------之ListView自适应实现表格(转) Android入门教程(三十二)------之SQLite分页表格(转) Android入门教程(三十一)------SQLite分页读取(转) Android入门教程(二十九)------之BroadcastReceiver (转) Android入门教程(二十八)------之Service(转) Android入门教程(二十七)------之Style与Theme (转) Android入门教程(二十六)------之ActivityGroup + GridView 实现Tab分页标签(转) Android入门教程(二十五)------之画图(转) Android入门教程(二十四)------之Gallery + ImageSwitcher(转) Android入门教程(二十三)------之Gallery(转) Android入门教程(二十二)------之TabHost,TabWidget(转) Android入门教程(二十一)------之PopupWindow (转) Android入门教程(二十)之--之AlertDialog(转)
Android入门教程(三十)------之XML解析与生成(转)
生如夏花之灿烂 · 2011-08-11 · via 博客园 - 生如夏花之灿烂

本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处!

       本文使用SAX来解析XML,在Android里面可以使用SAX和DOM,DOM需要把整个XML文件读入内存再解析,比较消耗内存,而SAX基于事件驱动的处理方式,可以在各节点触发回调函数,不过SAX适合节点结构简单的XML文档,复杂的XML文档在后期的节点深度处理会有点麻烦。

本文要解析的test.xml文件如下:

  1. <?xml version="1.0" encoding="utf-8"?>   
  2. <test>   
  3.   <title>testSAX</title>   
  4.     <content aa="1" bb="2">   
  5.       <name>hellogv</name>   
  6.       <url>http://blog.csdn.net/hellogv</url>   
  7.     </content>  
  8. </test>   

解析如上XML的结果如下:

 

使用SAX解析,需要定义SAXParserFactory(使应用程序能够配置和获取基于 SAX 的解析器以解析 XML 文档),SAXParser(从各种输入源解析 XML),XMLReader(使用回调函数读取 XML 文档),其中XMLReader是个关键。XMLReader可以为解析XML定义各种回调函数,“条件符合”的时候触发这些回调函数。

  1. SAXParserFactory factory = SAXParserFactory.newInstance();  
  2. SAXParser parser = factory.newSAXParser();  
  3. XMLReader reader = parser.getXMLReader();  
  4. reader.setContentHandler(handler);  
  5. reader.parse(new InputSource(testSAX.this.getResources()  
  6.         .openRawResource(R.raw.test)));  

在这段代码里,XMLReader就调用继承DefaultHandler的SAXHandler。DefaultHandler已实现ContentHandler, DTDHandler, EntityResolver, ErrorHandler等接口,包含常见读取XML的操作,具体请看下面的SAXHandler.java源码。

生成XML的结果如下:

上图是读取各节点之后,使用XmlSerializer重新组合并输出XML字符串。

本文的main.xml代码如下:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical" android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent">  
  5.   
  6.     <Button android:layout_height="wrap_content"  
  7.         android:layout_width="fill_parent" android:id="@+id/btnSAX"  
  8.         android:text="使用SAX解析XML"></Button>  
  9.     <Button android:layout_height="wrap_content"  
  10.         android:layout_width="fill_parent" android:text="生成XML" android:id="@+id/btnOutput"></Button>  
  11.     <EditText android:text="@+id/EditText01" android:id="@+id/EditText01"  
  12.         android:layout_width="fill_parent" android:layout_height="fill_parent"></EditText>  
  13.   
  14. </LinearLayout>  

SAXHandler.java的源码如下:

  1. package com.testSAX;  
  2.   
  3. import java.util.ArrayList;  
  4. import org.xml.sax.Attributes;  
  5. import org.xml.sax.SAXException;  
  6. import org.xml.sax.helpers.DefaultHandler;  
  7.   
  8. import android.util.Log;  
  9.   
  10. public class SAXHandler extends DefaultHandler{  
  11.         private ArrayList<String> keys = new ArrayList<String>();  
  12.         private ArrayList<Object> values = new ArrayList<Object>();  
  13.         @Override  
  14.         public void startDocument() throws SAXException {  
  15.             super.startDocument();  
  16.   
  17.         }  
  18.   
  19.         @Override  
  20.         public void endDocument() throws SAXException {  
  21.             super.endDocument();  
  22.         }  
  23.   
  24.         @Override  
  25.         public void startElement(String uri, String localName, String qName,  
  26.                 Attributes attributes) throws SAXException {  
  27.               
  28.             keys.add("startTag");  
  29.             values.add(localName);  
  30.   
  31.             Log.e("startTag",localName);  
  32.               
  33.             for ( int i = 0; i < attributes.getLength(); i++ ){  
  34.                 keys.add("Attr");  
  35.                 String[] str=new String[2];  
  36.                 str[0]=attributes.getLocalName(i);  
  37.                 str[1]=attributes.getValue(i);  
  38.                 values.add(str);  
  39.                 Log.e("Attr",str[0]+"="+str[1]);  
  40.                 }  
  41.         }  
  42.   
  43.         @Override  
  44.         public void endElement(String uri, String localName, String qName)  
  45.                 throws SAXException {  
  46.               
  47.             keys.add("endTag");  
  48.             values.add(localName);  
  49.             Log.e("endTag",localName);  
  50.         }  
  51.   
  52.         @Override  
  53.         public void characters(char[] ch, int start, int length)  
  54.                 throws SAXException {  
  55.             String value = new String(ch, start, length);  
  56.             value = value.trim();  
  57.             if (value.length() == 0)  
  58.                 return;  
  59.               
  60.             keys.add("text");  
  61.             values.add(value);  
  62.             Log.e("text",value);  
  63.         }  
  64.           
  65.         public ArrayList<String> GetKeys()  
  66.         {  
  67.             return keys;  
  68.         }  
  69.           
  70.         public ArrayList<Object> GetValues()  
  71.         {  
  72.             return values;  
  73.         }  
  74.           
  75.   
  76. }  

testSAX.java的源码如下:

  1. package com.testSAX;  
  2.   
  3. import java.io.StringWriter;  
  4.   
  5. import javax.xml.parsers.SAXParser;  
  6. import javax.xml.parsers.SAXParserFactory;  
  7.   
  8. import org.xml.sax.InputSource;  
  9. import org.xml.sax.XMLReader;  
  10. import org.xmlpull.v1.XmlSerializer;  
  11.   
  12. import android.app.Activity;  
  13. import android.os.Bundle;  
  14.   
  15. import android.util.Xml;  
  16. import android.view.View;  
  17. import android.widget.Button;  
  18. import android.widget.EditText;  
  19.   
  20. public class testSAX extends Activity {  
  21.       
  22.     Button btnSAX, btnOutput;  
  23.     EditText memo;  
  24.     SAXHandler handler = new SAXHandler();  
  25.   
  26.       
  27.     @Override  
  28.     public void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         setContentView(R.layout.main);  
  31.         btnSAX = (Button) this.findViewById(R.id.btnSAX);  
  32.         btnSAX.setOnClickListener(new ClickEvent());  
  33.         btnOutput = (Button) this.findViewById(R.id.btnOutput);  
  34.         btnOutput.setOnClickListener(new ClickEvent());  
  35.         memo = (EditText) this.findViewById(R.id.EditText01);  
  36.   
  37.     }  
  38.   
  39.     class ClickEvent implements View.OnClickListener {  
  40.   
  41.         @Override  
  42.         public void onClick(View v) {  
  43.             if (v == btnSAX) {  
  44.                 try {  
  45.                     SAXParserFactory factory = SAXParserFactory.newInstance();  
  46.                     SAXParser parser = factory.newSAXParser();  
  47.                     XMLReader reader = parser.getXMLReader();  
  48.                     reader.setContentHandler(handler);  
  49.                     reader.parse(new InputSource(testSAX.this.getResources()  
  50.                             .openRawResource(R.raw.test)));  
  51.                 } catch (Exception ee) {}  
  52.             }  
  53.             else if (v == btnOutput) {  
  54.                 try {  
  55.                     XmlSerializer serializer = Xml.newSerializer();  
  56.                     StringWriter writer = new StringWriter();  
  57.                     try {  
  58.                         serializer.setOutput(writer);  
  59.                         serializer.startDocument("UTF-8",true);  
  60.                           
  61.                         for(int i=0;i<handler.GetKeys().size();i++)  
  62.                         {  
  63.                             if(handler.GetKeys().get(i).equals("startTag"))  
  64.                             {  
  65.                                 serializer.startTag("", (String) handler.GetValues().get(i));  
  66.                             }  
  67.                             else if(handler.GetKeys().get(i).equals("Attr")){  
  68.                                 String[] str= (String[]) handler.GetValues().get(i);  
  69.                                 serializer.attribute("",str[0],str[1]);  
  70.                             }  
  71.                             else if(handler.GetKeys().get(i).equals("text"))  
  72.                                 serializer.text((String)handler.GetValues().get(i));  
  73.                             else if(handler.GetKeys().get(i).equals("endTag"))  
  74.                             {  
  75.                                 serializer.endTag("", (String) handler.GetValues().get(i));  
  76.                             }  
  77.                         }  
  78.                         serializer.endDocument();  
  79.                         String text=writer.toString();  
  80.                         text=text.replace("><"">/r/n<");  
  81.                         memo.setText(text);  
  82.                     } catch (Exception e) {  
  83.                         throw new RuntimeException(e);  
  84.                     }  
  85.                       
  86.                 } catch (Exception e) {}  
  87.             }  
  88.   
  89.         }  
  90.   
  91.     }  
  92. }