广

android开发

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

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

    2018-04-06 10:41:12 次阅读 稿源:互联网
    广告

      前言 

      本文主要介绍在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;

    import java.io.StringReader;

    import javax.xml.parsers.SAXParserFactory;

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

    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);
        }

    }

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告