21天学习android开发教程之XML解析与生成
本文使用SAX来解析XML,在Android里面可以使用SAX和DOM,DOM需要把整个XML文件读入内存再解析,比较消耗内存,而SAX基于事件驱动的处理方式,可以在各节点触发回调函数,不过SAX适合节点结构简单的XML文档,复杂的XML文档在后期的节点深度处理会有点麻烦。
本文要解析的test.xml文件如下:
<?xmlversion="1.0"encoding="utf-8"?> <test> <title>testSAX</title> <contentaa="1"bb="2"> <name>hellogv</name> <url>http://blog.csdn.net/hellogv</url> </content> </test>
使用SAX解析,需要定义SAXParserFactory(使应用程序能够配置和获取基于SAX的解析器以解析XML文档),SAXParser(从各种输入源解析XML),XMLReader(使用回调函数读取XML文档),其中XMLReader是个关键。XMLReader可以为解析XML定义各种回调函数,“条件符合”的时候触发这些回调函数。
SAXParserFactoryfactory=SAXParserFactory.newInstance(); SAXParserparser=factory.newSAXParser(); XMLReaderreader=parser.getXMLReader(); reader.setContentHandler(handler); reader.parse(newInputSource(testSAX.this.getResources() .openRawResource(R.raw.test)));
在这段代码里,XMLReader就调用继承DefaultHandler的SAXHandler。DefaultHandler已实现ContentHandler,DTDHandler,EntityResolver,ErrorHandler等接口,包含常见读取XML的操作,具体请看下面的SAXHandler.java源码。
读取各节点之后,使用XmlSerializer重新组合并输出XML字符串。本文的main.xml代码如下:
<linearlayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"android:layout_width="fill_parent" android:layout_height="fill_parent"> <buttonandroid:layout_height="wrap_content" android:layout_width="fill_parent"android:id="@+id/btnSAX" android:text="使用SAX解析XML"> <buttonandroid:layout_height="wrap_content" android:layout_width="fill_parent"android:text="生成XML"android:id="@+id/btnOutput"> <edittextandroid:text="@+id/EditText01"android:id="@+id/EditText01" android:layout_width="fill_parent"android:layout_height="fill_parent">
testSAX.java的源码如下:
packagecom.testSAX;
importjava.io.StringWriter;
importjavax.xml.parsers.SAXParser;
importjavax.xml.parsers.SAXParserFactory;
importorg.xml.sax.InputSource;
importorg.xml.sax.XMLReader;
importorg.xmlpull.v1.XmlSerializer;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.util.Xml;
importandroid.view.View;
importandroid.widget.Button;
importandroid.widget.EditText;
publicclasstestSAXextendsActivity{
/**Calledwhentheactivityisfirstcreated.*/
ButtonbtnSAX,btnOutput;
EditTextmemo;
SAXHandlerhandler=newSAXHandler();
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnSAX=(Button)this.findViewById(R.id.btnSAX);
btnSAX.setOnClickListener(newClickEvent());
btnOutput=(Button)this.findViewById(R.id.btnOutput);
btnOutput.setOnClickListener(newClickEvent());
memo=(EditText)this.findViewById(R.id.EditText01);
}
classClickEventimplementsView.OnClickListener{
@Override
publicvoidonClick(Viewv){
if(v==btnSAX){//解析XML,并保存标记,属性等值
try{
SAXParserFactoryfactory=SAXParserFactory.newInstance();
SAXParserparser=factory.newSAXParser();
XMLReaderreader=parser.getXMLReader();
reader.setContentHandler(handler);
reader.parse(newInputSource(testSAX.this.getResources()
.openRawResource(R.raw.test)));
}catch(Exceptionee){}
}
elseif(v==btnOutput){//生成XML
try{
XmlSerializerserializer=Xml.newSerializer();
StringWriterwriter=newStringWriter();
try{
serializer.setOutput(writer);
serializer.startDocument("UTF-8",true);
for(inti=0;i<handler.getkeys().size();i++)
{
if(handler.GetKeys().get(i).equals("startTag"))
{
serializer.startTag("",(String)handler.GetValues().get(i));
}
elseif(handler.GetKeys().get(i).equals("Attr")){
String[]str=(String[])handler.GetValues().get(i);
serializer.attribute("",str[0],str[1]);
}
elseif(handler.GetKeys().get(i).equals("text"))
serializer.text((String)handler.GetValues().get(i));
elseif(handler.GetKeys().get(i).equals("endTag"))
{
serializer.endTag("",(String)handler.GetValues().get(i));
}
}
serializer.endDocument();
Stringtext=writer.toString();
text=text.replace("><",">/r/n<");
memo.setText(text);//输出到文本框
}catch(Exceptione){
thrownewRuntimeException(e);
}
}catch(Exceptione){}
}
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助。