Android开发之XML文件解析的使用

2016-02-19 10:03 9 1 收藏

今天给大家分享的是由图老师小编精心为您推荐的Android开发之XML文件解析的使用,喜欢的朋友可以分享一下,也算是给小编一份支持,大家都不容易啊!

【 tulaoshi.com - 编程语言 】

  前言 

  本文主要介绍在Android中怎样来解析XML文件。主要采用的是SAX机制,SAX全称为Simple API for XML,它既是一种接口,也是一个软件包。作为接口,SAX是事件驱动型XML解析的一个标准接口。XML文件解析一般有2种方法,DOM和SAX。其中DOM需要先将xml文档全部读入到电脑内存中,当文档内容太大时,该方法并不适用。SAX就比较好的解决了该问题,它是逐行解析的,可以随时中断。但是SAX的操作比较复杂。因此,这2种方法各有优缺点,看具体应用情况。在前面的文章Qt学习之路_12(简易数据管理系统)中使用的是Qt中的DOM方法。

  实验说明

  大多数SAX实现都会产生类似下面的事件:

  在文档的开始和结束处触发文档处理事件;在文档内每一XML元素结束解析的前后触发元素事件;任何元数据通常豆油单独的事件交付;在处理文档的DTD或者Schema时产生DTD 或者Schema事件;产生错误事件用来通知主机应用程序解析错误。

  SAX模型示意图如下所示:

   

  如果要用SAX来解析xml文档,则需要一个类来继承android系统提供的ContentHandler类。但是如果继承ContentHandler这个类, 即使你不使用这个类提供的所有方法,你也必须实现其内部的所有方法(一般情况下没有使用的方法可以直接用空方法代替),但是这样开发起来不是很方便。因此我们可以改为继承DefaultHandler这个类,这样的话我们只需要实现程序中所需要的方法即可,其它的方法这个类内部其实已经用空方法代替了。

ContentHandler接口的方法有以下几种:

void startDocument();//文档解析开始时执行

void endDocument();//文档解析结束时执行

void startElement(String uri, String localName, String qName, Attributes atts);//标签开始解析时执行

void endElement(String uri, String localName, String qName, Attributes atts);//标签解析结束时执行

void characters(char[] ch, int start, int length );//解析标签属性时执行

  android中使用SAX来解析xml文件,需先建立一个SAX工厂,即SAXParserFactory对象,还需建立一个XMLReader对象,该类绑定ContentHandler子类,且与xml源文件结合在一起。即其处理过程为创建事件处理程序,创建SAX解析器,键事件处理程序分配给解析器,对文档进行解析,将每个事件发送给处理程序。 

  判断String类型的值是否相等采用的是String类的equal方法。 

  本实验是解析一段xml代码,然后在上面每个解析函数中打印一些内容。主要是学会怎么使用SAX模型来来创建解析器,怎样使用ContentHandler子类的函数来进行解析。

  实验主要部分代码:

Mainactivity.java:

代码如下:

package com.example.xml;

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

import java.io.StringReader;

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

    private Button start  = null;
    private TextView display = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        start = (Button)findViewById(R.id.start);
        start.setOnClickListener(new StartOnClickListener());
    }

    public class StartOnClickListener implements OnClickListener{

        public void onClick(View v) {
            // TODO Auto-generated method stub
            //注意2点,第1:字符串中如果要换行写,则应该用引号和加号来相加得到,不能直接换行写
            //第2点:如果字符串中有字符,则用括号里面的符合(")代替引号。
            //我这里用的xml文件直接为该程序layout的布局xml文件
//            String result_str =
//            "RelativeLayout " +
//              "  xmlns:tools="http://schemas.android.com/tools" " +
//              "  android:layout_width="match_parent" " +
//              "  android:layout_height="match_parent" " +
//           
//             "   Button  " +
//               "     android:id="@+id/start"    " +
//                 "   android:layout_width="fill_parent"    " +
//                  "  android:layout_height="wrap_content"    " +
//                 "   android:layout_alignParentBottom="true"    " +
//                  "  android:text="Start XML Parse"    "    +
//                "    / " +
//              "  TextView " +
//                "    android:id="@+id/display" " +
//               "     android:layout_width="fill_parent"    " +
//                "    android:layout_height="fill_parent"    " +
//                "    android:gravity="center"    " +
//                "     android:layout_alignParentLeft="true"    "    +
//                "     android:layout_above="@+id/start"    "    +
//                "     android:text="The XML Parse Example!!"    " +
//                "    /    " +
//        "    /RelativeLayout";

            String result_str =        
             "   Button  " +
               "     id="@+id/start"    " +
                 "   layoutwidth="fillparent"    " +
                  "  layoutheight="wrapcontent"    " +
                 "   layoutalignParentBottom="true"    " +
                  "  text="Start XML Parse"    "    +
                "    /Button " ;

           
            System.out.println(result_str);
            try{
                //创建SAX工厂
                SAXParserFactory factory = SAXParserFactory.newInstance();
                XMLReader reader = factory.newSAXParser().getXMLReader();
                reader.setContentHandler(new MyContentHandler());
                reader.parse(new InputSource(new StringReader(result_str)));
            }
            catch(Exception e) {
                e.printStackTrace();
            }

        }

    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

MyContentHandler.java:
代码如下:

package com.example.xml;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class MyContentHandler extends DefaultHandler {

    String tagname, sid, swidth, sheight, text, salign;

    //当解析到标签的属性栏时调用该方法
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        // TODO Auto-generated method stub
        if(tagname.equals("id"))
            sid = new String(ch, start, length);
        else if(tagname.equals("layoutwidth"))
            swidth = new String(ch, start, length);
        else if(tagname.equals("layoutheight"))
            sheight = new String(ch, start, length);
        else if(tagname.equals("layoutalignParentBottom"))
            salign = new String(ch, start, length);
        else if(tagname.equals("text"))
            text = new String(ch, start, length);
        super.characters(ch, start, length);
    }

    //解析文档结束调用
    @Override
    public void endDocument() throws SAXException {
        // TODO Auto-generated method stub
        System.out.println("........end.......");
        super.endDocument();
    }

    //解析标签结束时调用
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        // TODO Auto-generated method stub
        if(tagname.equals("Button")) {
            this.printout();
        }
        super.endElement(uri, localName, qName);
    }

    //解析文档开始时调用
    @Override
    public void startDocument() throws SAXException {
        // TODO Auto-generated method stub
        System.out.println("........begin.......");
        super.startDocument();
    }

    //标签开始时执行
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // TODO Auto-generated method stub
        tagname = localName;
        if(tagname.equals("Button")) {
            for(int i = 0; i attributes.getLength(); i++) {       
                //得到第i个属性的名字和值
                System.out.println(attributes.getLocalName(i) + "=" + attributes.getValue(i));
            }

        }
        super.startElement(uri, localName, qName, attributes);
    }

    //输出标签属性解析结果
    private void printout() {
        System.out.print("id: ");
        System.out.println(sid);
        System.out.print("layout_width: ");
        System.out.println(swidth);
        System.out.print("layout_height: ");
        System.out.println(sheight);
        System.out.print("layout_alignParentBottom: ");
        System.out.println(salign);
        System.out.print("text: ");
        System.out.println(text);
    }

}

来源:http://www.tulaoshi.com/n/20160219/1593164.html

延伸阅读
学习目的: 1、了解在Android中如何设置和调用XML资源 2、掌握如何利用XML和JAVA代码进行协同开发界面 3、理解R文件的作用 开发Android时,总能看到一个系统自动生成的R.java文件: 您必须了解一下几个要点: 1、R.java是自动生成的,并且强烈建议您不要去手动修改其中的代码。 2、R类中的若干个内部类的名字和Android项目中的res文...
标签: Web开发
在所有现代浏览器中,可能够查看原始的 XML 文件。 不要指望 XML 文件会直接显示为 HTML 页面。 查看 XML 文件 查看这个 XML 文件:note.xml 打开 XML 文件 - XML 文档将显示为代码颜色化的根以及子元素。通过点击元素左侧的加号或减号,可以展开或收起元素的结构。如需查看不带有 + 和 - 符号的源代码,请从浏览器...
标签: Web开发
代码如下: html xmlns="http://www.w3.org/1999/xhtml" head runat="server" titlejquery xml解析/title script src="jquery.min.js" type="text/javascript"/script script type="text/javascript" $(document).ready(function(){ $.ajax({url:"City.xml", success:function(xml){ $(xml).find("province").each(function(){ var t...
解析XML文件: 在Android平台上可以使用SAX、DOM和Android附带的pull解析器解析XML文件; pull解析器提供了各种事件,使用parser.next()方法进入下一个元素并触发相应事件,pull解析器产生的事件是一个数字,可以通过switch对感兴趣的事件进行处理;通过paser.nextText()方法可以获取下一个Text类型的节点的值; http://xmlpull.org/xmlpull-w...
标签: Web开发
通过使用 CSS,可为 XML 文档添加显示信息。 使用 CSS 显示您的 XML? 使用 CSS 来格式化 XML 文档是有可能的。 下面的例子就是关于如何使用 CSS 样式表来格式化某个XML文档: 这是 XML 文件:CD 目录 这是样式表:CSS 文件 最后,请查看效果:由 CSS 文件格式化的 CD 目录 下面是此XML文件的一个片断...

经验教程

496

收藏

59
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部