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

来源:互联网 发布:kindle选购 知乎 编辑:程序博客网 时间:2024/06/07 08:38
http://blog.csdn.net/hellogv/archive/2010/11/12/6004624.aspx
本文使用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) {}              }            }        }  }  
原创粉丝点击