本文來自http://blog.csdn.net/hellogv/ ,引用必須註明出處!
本文使用SAX來解析XML,在Android裡面可以使用SAX和DOM,DOM需要把整個XML檔案讀入記憶體再解析,比較消耗記憶體,而SAX基於事件驅動的處理方式,可以在各節點觸發回呼函數,不過SAX適合節點結構簡單的XML文檔,複雜的XML文檔在後期的節點深度處理會有點麻煩。
本文要解析的test.xml檔案如下:
<?xml version="1.0" encoding="utf-8"?><br /><test><br /> <title>testSAX</title><br /> <content aa="1" bb="2"><br /> <name>hellogv</name><br /> <url>http://blog.csdn.net/hellogv</url><br /> </content><br /></test>
解析如上XML的結果如下:
使用SAX解析,需要定義SAXParserFactory(使應用程式能夠配置和擷取基於 SAX 的解析器以解析 XML 文檔),SAXParser(從各種輸入源解析 XML),XMLReader(使用回呼函數讀取 XML 文檔),其中XMLReader是個關鍵。XMLReader可以為解析XML定義各種回呼函數,“條件符合”的時候觸發這些回呼函數。
SAXParserFactory factory = SAXParserFactory.newInstance();<br />SAXParser parser = factory.newSAXParser();<br />XMLReader reader = parser.getXMLReader();<br />reader.setContentHandler(handler);<br />reader.parse(new InputSource(testSAX.this.getResources()<br />.openRawResource(R.raw.test)));
在這段代碼裡,XMLReader就調用繼承DefaultHandler的SAXHandler。DefaultHandler已實現ContentHandler, DTDHandler, EntityResolver, ErrorHandler等介面,包含常見讀取XML的操作,具體請看下面的SAXHandler.java源碼。
產生XML的結果如下:
是讀取各節點之後,使用XmlSerializer重新組合并輸出XML字串。
本文的main.xml代碼如下:
<?xml version="1.0" encoding="utf-8"?><br /><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"<br />android:orientation="vertical" android:layout_width="fill_parent"<br />android:layout_height="fill_parent"></p><p><Button android:layout_height="wrap_content"<br />android:layout_width="fill_parent" android:id="@+id/btnSAX"<br />android:text="使用SAX解析XML"></Button><br /><Button android:layout_height="wrap_content"<br />android:layout_width="fill_parent" android:text="產生XML" android:id="@+id/btnOutput"></Button><br /><EditText android:text="@+id/EditText01" android:id="@+id/EditText01"<br />android:layout_width="fill_parent" android:layout_height="fill_parent"></EditText></p><p></LinearLayout><br />
SAXHandler.java的源碼如下:
package com.testSAX;</p><p>import java.util.ArrayList;<br />import org.xml.sax.Attributes;<br />import org.xml.sax.SAXException;<br />import org.xml.sax.helpers.DefaultHandler;</p><p>import android.util.Log;</p><p>public class SAXHandler extends DefaultHandler{<br /> private ArrayList<String> keys = new ArrayList<String>();//儲存欄位名稱<br /> private ArrayList<Object> values = new ArrayList<Object>();//儲存值<br />@Override<br />public void startDocument() throws SAXException {<br />super.startDocument();</p><p>}</p><p>@Override<br />public void endDocument() throws SAXException {<br />super.endDocument();<br />}</p><p>@Override<br />public void startElement(String uri, String localName, String qName,<br />Attributes attributes) throws SAXException {<br />//儲存開始標記<br />keys.add("startTag");<br />values.add(localName);</p><p>Log.e("startTag",localName);<br />//儲存屬性值<br />for ( int i = 0; i < attributes.getLength(); i++ ){<br />keys.add("Attr");<br />String[] str=new String[2];<br />str[0]=attributes.getLocalName(i);<br />str[1]=attributes.getValue(i);<br />values.add(str);<br />Log.e("Attr",str[0]+"="+str[1]);<br />}<br />}</p><p>@Override<br />public void endElement(String uri, String localName, String qName)<br />throws SAXException {<br />//儲存結束標記<br />keys.add("endTag");<br />values.add(localName);<br />Log.e("endTag",localName);<br />}</p><p>@Override<br />public void characters(char[] ch, int start, int length)<br />throws SAXException {<br />String value = new String(ch, start, length);<br />value = value.trim();<br />if (value.length() == 0)<br />return;</p><p>keys.add("text");<br />values.add(value);<br />Log.e("text",value);<br />}</p><p>public ArrayList<String> GetKeys()<br />{<br />return keys;<br />}</p><p>public ArrayList<Object> GetValues()<br />{<br />return values;<br />}</p><p>}<br />
testSAX.java的源碼如下:
package com.testSAX;</p><p>import java.io.StringWriter;</p><p>import javax.xml.parsers.SAXParser;<br />import javax.xml.parsers.SAXParserFactory;</p><p>import org.xml.sax.InputSource;<br />import org.xml.sax.XMLReader;<br />import org.xmlpull.v1.XmlSerializer;</p><p>import android.app.Activity;<br />import android.os.Bundle;</p><p>import android.util.Xml;<br />import android.view.View;<br />import android.widget.Button;<br />import android.widget.EditText;</p><p>public class testSAX extends Activity {<br />/** Called when the activity is first created. */<br />Button btnSAX, btnOutput;<br />EditText memo;<br />SAXHandler handler = new SAXHandler();</p><p>@Override<br />public void onCreate(Bundle savedInstanceState) {<br />super.onCreate(savedInstanceState);<br />setContentView(R.layout.main);<br />btnSAX = (Button) this.findViewById(R.id.btnSAX);<br />btnSAX.setOnClickListener(new ClickEvent());<br />btnOutput = (Button) this.findViewById(R.id.btnOutput);<br />btnOutput.setOnClickListener(new ClickEvent());<br />memo = (EditText) this.findViewById(R.id.EditText01);</p><p>}</p><p>class ClickEvent implements View.OnClickListener {</p><p>@Override<br />public void onClick(View v) {<br />if (v == btnSAX) {//解析XML,並儲存標記,屬性等值<br />try {<br />SAXParserFactory factory = SAXParserFactory.newInstance();<br />SAXParser parser = factory.newSAXParser();<br />XMLReader reader = parser.getXMLReader();<br />reader.setContentHandler(handler);<br />reader.parse(new InputSource(testSAX.this.getResources()<br />.openRawResource(R.raw.test)));<br />} catch (Exception ee) {}<br />}<br />else if (v == btnOutput) {//產生XML<br />try {<br />XmlSerializer serializer = Xml.newSerializer();<br />StringWriter writer = new StringWriter();<br />try {<br />serializer.setOutput(writer);<br />serializer.startDocument("UTF-8",true);</p><p>for(int i=0;i<handler.GetKeys().size();i++)<br />{<br />if(handler.GetKeys().get(i).equals("startTag"))<br />{<br />serializer.startTag("", (String) handler.GetValues().get(i));<br />}<br />else if(handler.GetKeys().get(i).equals("Attr")){<br />String[] str= (String[]) handler.GetValues().get(i);<br />serializer.attribute("",str[0],str[1]);<br />}<br />else if(handler.GetKeys().get(i).equals("text"))<br />serializer.text((String)handler.GetValues().get(i));<br />else if(handler.GetKeys().get(i).equals("endTag"))<br />{<br />serializer.endTag("", (String) handler.GetValues().get(i));<br />}<br />}<br />serializer.endDocument();<br />String text=writer.toString();<br />text=text.replace("><", ">/r/n<");<br />memo.setText(text);//輸出到文字框<br />} catch (Exception e) {<br />throw new RuntimeException(e);<br />}</p><p>} catch (Exception e) {}<br />}</p><p>}</p><p>}<br />}