`
ictch
  • 浏览: 131673 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

对Android中XML解析的小结

阅读更多

首先说明下为什么用SAX去解析~~现在随便去google一搜索很多的方法去解析XML
因为现在XML满大街都是~~新闻可以用~~天气可以用~~论坛博客都可以用~~
J2EE 里面经常用~~SSH框架~~同样用的很多
就连现在Android的核心配置文件AndroidManifest.xml都是XML格式的
以及res下面的文件基本上都是XML格式的~~在应用范围非常的广~~而且从存储和读取方面来说也比较方便
普通的解析XML有很多方式DOM、SAX、JDOM、DOM4J、Xerces、JAXP
在android里面有Dom和Sax两种方式~~
这里说用SAX解析~~SAX解析不是将XML下载到本地后再进行解压而是在保证网络连接的同时进行解析的
这样可以大大的节省空间~~当然了对网络也是有要求的必须联网~~WIFI~~GPRS(好像有限制)都可以
行了~~开整~~
首先要知道XML的结构~~~
下面给出一段XML文档从新浪的http://news.163.com/special/00011K6L/rss_newstop.xml中复制下来的~~后面的解析也是一这个XML为基础的
view sourceprint?
01
<?xml version="1.0" encoding="GBK"?>
02
<?xml-stylesheet type="text/css" href="http://news.163.com/css/allrss.css"?>
03
<rss version="2.0">
04
<channel>
05
<title>网易头条新闻</title>
06
<link>http://news.163.com/</link>
07
<description>网易头条新闻</description>
08
<pubDate>Thu, 19 Aug 2010 08:41:34 GMT</pubDate>
09
<lastBuildDate>Thu, 19 Aug 2010 08:41:34 GMT</lastBuildDate>
10
<item id="1">
11
<title><![CDATA[国新办王晨:营造文明和谐网络环境]]></title>
12
<link>http://news.163.com/10/0819/16/6EFB4LFR0001124J.html</link>
13
<description><![CDATA[资料图:王晨视察杭州网易 人民网北京8月19日报道 “文明上网 共建和谐”网上征文和知识竞赛活动启动仪式今天在北京举行,中宣部副部长,中央外宣办、国务院新闻办主任王晨在会上发表了讲话。讲话全文如下: 共同营造文明和谐的网络环境 ——在“文明上网 共建和谐”网上征文和知识竞赛活动启动仪式上的讲话 各位来宾,同志 ]]>......</description>
14
<pubDate>2010-08-19 16:41:34</pubDate>
15
</item>
16
<item id="2">
17
<title><![CDATA[文明上网活动启动]]></title>
18
<link>http://news.163.com/special/0001213L/renminwangzhengwen.html</link>
19
<description><![CDATA[ ]]>......</description>
20
<pubDate>2010-08-20 19:34:57</pubDate>
21
</item>
22
<item id="3">
23
<title><![CDATA[警方称长沙税务局爆炸案疑犯曾多次恐吓税官]]></title>
24
<link>http://news.163.com/10/0821/02/6EIVOUQ500014AED.html</link>
25
<description><![CDATA[爆炸现场(资料图) 犯罪嫌疑人刘赘衡被警方抓获 新京报8月21日报道  昨日,长沙警方公布了7月30日致4人死亡、9人受伤的“税务局爆炸案”疑犯刘赘衡的作案动机。警方称,刘赘衡因生意亏损归咎于并不相识的原建设银行湖南省分行行长彭某与商人陈某,并将在税务部门工作的彭某之子炸死。 曾来京津躲“瘟神” 长沙警方介绍  ]]>......</description>
26
<pubDate>2010-08-21 06:25:28</pubDate>
27
</item>


第一行的 <?xml version="1.0" encoding="GBK"?>-->是所有的XML文件的头文件“必须不能少”
1.0是版本~~GBK是编码当然也可以是UTF-8的但是我们是读取那么就不能设定编码~~
注意:android里解析XML是不支持GBK的,会报错(后面的帖子会说如何转换格式的)
org.apache.harmony.xml.ExpatParser$ParseException:At line 4,column 11:not well-formed
第2,3行猜想是使用css的格式以及rss的版本
下面的就是重要的了~~
从第四行开始~~就是节点了~~节点是以<channel>开始~~以</channel>结尾 注意:里面的内容可以变但是结构不能变
也就是说我可以是<xixi></xixi>这样但是不能<xixi><xixi>这样~~这相当于创建2个节点但是没有结尾
后面一直到</channel>之前都属于子节点~~子节点的意思就是他们共有一个父节点(爹)
10-14行的时候出来了个新的东西我管他叫子节点的子节点(孙节点)
因为6-9行里的这几个孙节点都有一个父节点<item id="1">
在所有的<item id=“”>里他们又有一个共同的父节点<channel>
这个伦理关系比较麻烦~~父节点-->一级节点
子节点-->二级节点
子节点的子节点(孙节点)-->3级节点
以上都是我自己的称呼~~不要一一深究谢谢
上面的是基本结构~~在<item id=“”>里面有id=“”这个是指当前节点的属性
当然属性也可以自己定义的~~
明白了XML总结下
除了<?xml version="1.0" encoding="GBK"?>头文件
以及节点的格式是固定外~~基本上其他的都是我们可以自己定义的
这样给我们就有很大的空间了~~~只要了解了XML的结构无论是写入还是读取就比较好搞了

 

 

以下使用SAX来解析XML,在Android里面可以使用SAX和DOM,DOM需要把整个XML文件读入内存再解析,比较消耗内存,而SAX基于事件驱动的处理方式,可以在各节点触发回调函数,不过SAX适合节点结构简单的XML文档,复杂的XML文档在后期的节点深度处理会有点麻烦。

本文要解析的test.xml文件如下:

view plaincopy to clipboardprint?
<?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 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?
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)));  
     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?
<?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>  
<?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源码如下:

view plaincopy to clipboardprint?
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;   
        }   
           
  
}  
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?
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) {}   
            }   
  
        }   
  
    }   

 

分享到:
评论

相关推荐

    Android 初学中阶高阶书籍_集合打包3

    Android系统概述,Android系统的开发综述,Android的Linux内核与驱动程序,Android的底层库和程序,Android的JAVA虚拟机 ...图,Android的XML解析,牛人Android提高篇,手把手教你用Android开发新浪微博客户端

    Android 初学中阶高阶书籍_集合打包2

    Android系统概述,Android系统的开发综述,Android的Linux内核与驱动程序,Android的底层库和程序,Android的JAVA虚拟机 ...图,Android的XML解析,牛人Android提高篇,手把手教你用Android开发新浪微博客户端

    Android开发与应用——张荣,原书配套课件

    1.5 小结 练习 第2章 Android开发环境 2.1 Java开发环境安装 2.1.1 安装JDK 2.1.2 安装Eclipse 2.1.3 Eclipse中文包的安装 2.2 Android SDK 2.2.1 安装ADT 2.2.2 安装Android SDK 2.3 Android...

    精通ANDROID 3(中文版)1/2

    1.8 小结  第2章 设置开发环境  2.1 设置环境  2.1.1 下载JDK 6  2.1.2 下载Eclipse 3.6  2.1.3 下载Android SDK  2.1.4 命令行窗口  2.1.5 安装ADT  2.2 了解基本组件  2.2.1 View  2.2.2 ...

    Android实验七.doc

    INTERNET "/&gt; 实验结果截图: 图表 1 选择城市界面 图表 2 城市天气界面 三、实验分析与小结: Socket通信开发步骤 (1)新建套接字,开启服务器监听 ServerSocket ss=new ServerSocket(3080) ; ss.accept(); (2)...

    Android核心技术与实例详解 PDF扫描版

    第三篇则对三个真实案例的开发步骤进行详细介绍 逐步向读者讲解Android手机应用程序的真实开发过程 同时在源代码中还包含了详细的注释 以尽量帮助读者掌握代码中的每一个细节 尽快掌握Android编程 本书的讲述...

    精通Android 3 (中文版)2/2

    1.8 小结  第2章 设置开发环境  2.1 设置环境  2.1.1 下载JDK 6  2.1.2 下载Eclipse 3.6  2.1.3 下载Android SDK  2.1.4 命令行窗口  2.1.5 安装ADT  2.2 了解基本组件  2.2.1 View  2.2.2 ...

    疯狂Android讲义源码

     1.7 本章小结 33  第2章 Android应用的界面编程 35  2.1 界面编程与视图(View)组件 36  2.1.1 视图组件与容器组件 36  2.1.2 使用XML布局文件控制UI  界面 40  2.1.3 在代码中控制UI界面 41  2.1.4 使用...

    Android典型技术模块开发详解

    8.6.2 WebView中对JavaScript的支持 8.7 Gallery (画廊) 8.8 SlidingDrawer(滑动抽屉) 8.9 Dialog(对话框) 8.9.1 AlertDialog警告框 8.9.2 ProgressDialog进度框 8.9.3 DatePickerDialog & TimePickerDialog...

    疯狂Android讲义.part2

    第1章 Android应用与开发环境 1 1.1 Android的发展和历史 2 1.1.1 Android的发展和简介 2 1.1.2 Android平台架构及特性 3 1.2 搭建Android开发环境 5 1.2.1 下载和安装Android SDK 5 ...19.10 本章小结 689

    疯狂Android讲义.part1

    第1章 Android应用与开发环境 1 1.1 Android的发展和历史 2 1.1.1 Android的发展和简介 2 1.1.2 Android平台架构及特性 3 1.2 搭建Android开发环境 5 1.2.1 下载和安装Android SDK 5 ...19.10 本章小结 689

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    2.4 本章小结 15 第三章 跨域交互缓存处理设计 17 3.1 跨域交互缓存处理需求 17 3.1.1 缓存技术WebStorage 17 3.1.2 跨域交互缓存处理需求 17 3.1.3 页面回退管理需求 17 3.2 缓存处理机制 18 3.2.1 跨域缓存处理 18...

    白帽子讲浏览器安全.钱文祥(带详细书签).pdf

    1.8 本章小结 12 2 浏览器中常见的安全概念 13 2.1 URL 13 2.1.1 URL的标准形式 15 2.1.2 IRI 16 2.1.3 URL的“可视化”问题——字形欺骗钓鱼攻击 18 2.1.4 国际化域名字形欺骗攻击 19 2.1.5 自纠错与Unicode...

    微信公众平台应用开发:方法、技巧与案例.(机械工业.柳峰)

     1.5 小结 19 第2章 编辑模式的使用 20  2.1 编辑模式的应用场景 20  2.2 自动回复 20  2.2.1 被添加自动回复 21  2.2.2 消息自动回复 22  2.2.3 关键词自动回复 22  2.2.4 自动回复优先规则 24  ...

Global site tag (gtag.js) - Google Analytics