您的位置:首页 > 移动开发 > Android开发

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

2010-11-12 12:03 615 查看
本文来自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"?> 
<test> 
  <title>testSAX</title> 
    <content aa="1" bb="2"> 
      <name>hellogv</name> 
      <url>http://blog.csdn.net/hellogv</url> 
    </content>
</test>

解析如上XML的结果如下:



使用SAX解析,需要定义SAXParserFactory(使应用程序能够配置和获取基于 SAX 的解析器以解析 XML 文档),SAXParser(从各种输入源解析 XML),XMLReader(使用回调函数读取 XML 文档),其中XMLReader是个关键。XMLReader可以为解析XML定义各种回调函数,“条件符合”的时候触发这些回调函数。
SAXParserFactory factory = SAXParserFactory.newInstance();
					SAXParser parser = factory.newSAXParser();
					XMLReader reader = parser.getXMLReader();
					reader.setContentHandler(handler);
					reader.parse(new InputSource(testSAX.this.getResources()
							.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"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="fill_parent">

	<Button android:layout_height="wrap_content"
		android:layout_width="fill_parent" android:id="@+id/btnSAX"
		android:text="使用SAX解析XML"></Button>
	<Button android:layout_height="wrap_content"
		android:layout_width="fill_parent" android:text="生成XML" android:id="@+id/btnOutput"></Button>
	<EditText android:text="@+id/EditText01" android:id="@+id/EditText01"
		android:layout_width="fill_parent" android:layout_height="fill_parent"></EditText>

</LinearLayout>

SAXHandler.java的源码如下:
package com.testSAX;

import java.util.ArrayList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import android.util.Log;

public class SAXHandler extends DefaultHandler{
	    private ArrayList<String> keys = new ArrayList<String>();//保存字段名称
	    private ArrayList<Object> values = new ArrayList<Object>();//保存值
		@Override
		public void startDocument() throws SAXException {
			super.startDocument();

		}

		@Override
		public void endDocument() throws SAXException {
			super.endDocument();
		}

		@Override
		public void startElement(String uri, String localName, String qName,
				Attributes attributes) throws SAXException {
			//保存开始标记
			keys.add("startTag");
			values.add(localName);

			Log.e("startTag",localName);
			//保存属性值
			for ( int i = 0; i < attributes.getLength(); i++ ){
				keys.add("Attr");
				String[] str=new String[2];
				str[0]=attributes.getLocalName(i);
				str[1]=attributes.getValue(i);
				values.add(str);
				Log.e("Attr",str[0]+"="+str[1]);
				}
		}

		@Override
		public void endElement(String uri, String localName, String qName)
				throws SAXException {
			//保存结束标记
			keys.add("endTag");
			values.add(localName);
			Log.e("endTag",localName);
		}

		@Override
		public void characters(char[] ch, int start, int length)
				throws SAXException {
			String value = new String(ch, start, length);
			value = value.trim();
			if (value.length() == 0)
				return;
			
			keys.add("text");
			values.add(value);
			Log.e("text",value);
		}
		
		public ArrayList<String> GetKeys()
		{
			return keys;
		}
		
		public ArrayList<Object> GetValues()
		{
			return values;
		}
		

}

testSAX.java的源码如下:
package com.testSAX;

import java.io.StringWriter;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xmlpull.v1.XmlSerializer;

import android.app.Activity;
import android.os.Bundle;

import android.util.Xml;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class testSAX extends Activity {
/** Called when the activity is first created. */
Button btnSAX, btnOutput;
EditText memo;
SAXHandler handler = new SAXHandler();


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnSAX = (Button) this.findViewById(R.id.btnSAX);
btnSAX.setOnClickListener(new ClickEvent());
btnOutput = (Button) this.findViewById(R.id.btnOutput);
btnOutput.setOnClickListener(new ClickEvent());
memo = (EditText) this.findViewById(R.id.EditText01);

}

class ClickEvent implements View.OnClickListener {

@Override
public void onClick(View v) {
if (v == btnSAX) {//解析XML,并保存标记,属性等值
try {
SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); XMLReader reader = parser.getXMLReader(); reader.setContentHandler(handler); reader.parse(new InputSource(testSAX.this.getResources() .openRawResource(R.raw.test)));
} catch (Exception ee) {}
}
else if (v == btnOutput) {//生成XML
try {
XmlSerializer serializer = Xml.newSerializer();
StringWriter writer = new StringWriter();
try {
serializer.setOutput(writer);
serializer.startDocument("UTF-8",true);

for(int i=0;i<handler.GetKeys().size();i++)
{
if(handler.GetKeys().get(i).equals("startTag"))
{
serializer.startTag("", (String) handler.GetValues().get(i));
}
else if(handler.GetKeys().get(i).equals("Attr")){
String[] str= (String[]) handler.GetValues().get(i);
serializer.attribute("",str[0],str[1]);
}
else if(handler.GetKeys().get(i).equals("text"))
serializer.text((String)handler.GetValues().get(i));
else if(handler.GetKeys().get(i).equals("endTag"))
{
serializer.endTag("", (String) handler.GetValues().get(i));
}
}
serializer.endDocument();
String text=writer.toString();
text=text.replace("><", ">/r/n<");
memo.setText(text);//输出到文本框
} catch (Exception e) {
throw new RuntimeException(e);
}

} catch (Exception e) {}
}

}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: