分享

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

 啵啵比 2011-03-31
Android提高第七篇之XML解析与生成 收藏
本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处!
       本文使用SAX来解析XML,在Android里面可以使用SAX和DOM,DOM需要把整个XML文件读入内存再解析,比较消耗内存,而SAX基于事件驱动的处理方式,可以在各节点触发回调函数,不过SAX适合节点结构简单的XML文档,复杂的XML文档在后期的节点深度处理会有点麻烦。
本文要解析的test.xml文件如下:
view plaincopy to clipboardprint?
01.<?xml version="1.0" encoding="utf-8"?>   
02.<test>   
03.  <title>testSAX</title>   
04.    <content aa="1" bb="2">   
05.      <name>hellogv</name>   
06.      <url>http://blog.csdn.net/hellogv</url>   
07.    </content> 
08.</test>  
<?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定义各种回调函数,“条件符合”的时候触发这些回调函数。
view plaincopy to clipboardprint?
01.SAXParserFactory factory = SAXParserFactory.newInstance();  
02.SAXParser parser = factory.newSAXParser();  
03.XMLReader reader = parser.getXMLReader();  
04.reader.setContentHandler(handler);  
05.reader.parse(new InputSource(testSAX.this.getResources()  
06.        .openRawResource(R.raw.test))); 
     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代码如下:
view plaincopy to clipboardprint?
01.<?xml version="1.0" encoding="utf-8"?> 
02.<LinearLayout xmlns:android="http://schemas./apk/res/android
03.    android:orientation="vertical" android:layout_width="fill_parent" 
04.    android:layout_height="fill_parent"> 
05. 
06.    <Button android:layout_height="wrap_content" 
07.        android:layout_width="fill_parent" android:id="@+id/btnSAX" 
08.        android:text="使用SAX解析XML"></Button> 
09.    <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> 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas./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的源码如下:
view plaincopy to clipboardprint?
01.package com.testSAX;  
02. 
03.import java.util.ArrayList;  
04.import org.xml.sax.Attributes;  
05.import org.xml.sax.SAXException;  
06.import org.xml.sax.helpers.DefaultHandler;  
07. 
08.import android.util.Log;  
09. 
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.} 
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的源码如下:
view plaincopy to clipboardprint?
01.package com.testSAX;  
02. 
03.import java.io.StringWriter;  
04. 
05.import javax.xml.parsers.SAXParser;  
06.import javax.xml.parsers.SAXParserFactory;  
07. 
08.import org.xml.sax.InputSource;  
09.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.    /** Called when the activity is first created. */ 
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) {//解析XML,并保存标记,属性等值  
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) {//生成XML  
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.} 
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hellogv/archive/2010/11/12/6004624.aspx

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多