Android学习笔记——xml

摘要:
DOM是把XML文档全部装载到内存中,然后当成一树进行处理。其弊端是操作起来相对不方便,而且对XML文档进行处理,如果修改、新增、删除等操作比较不方便。SAX是事件驱动型XML解析的一个标准接口。XML解析主要需要进行下列步骤:1.创建事件处理程序2.创建SAX解析器3.将事件处理程序分配给解析器4.对文档进行解析,将每个事件发送给处理程序。

转自http://blog.csdn.net/sam_zhang1984

解析XML有两种方式:SAX和DOM。它们各有利弊。

DOM是把XML文档全部装载到内存中,然后当成一树进行处理。其好处是当成树处理起来比较方便,但弊端是如果XML文件比较大时,会对内存消耗比较大;

SAX是逐行扫描XML文档,逐行解析,而且可以在处理XML文档过程中的任意时刻中止处理过程,比如找到我们的目标节点,剩下的XML文档内容就可以不读了,直接结束。其弊端是操作起来相对不方便,而且对XML文档进行处理,如果修改、新增、删除等操作比较不方便。

SAX是事件驱动型XML解析的一个标准接口。它的工作原理是读到文档的开始与结束、标签元素的开始与结束、内容实体等地方时,触发相应的函数,我们就可以在相应的函数中进行我们所要进行的处理。

XML解析主要需要进行下列步骤:

1.创建事件处理程序

2.创建SAX解析器

3.将事件处理程序分配给解析器

4.对文档进行解析,将每个事件发送给处理程序。

Android学习笔记——xml第1张

以下的代码是MainActivity.java中的代码

packagecom.example.xml;
importjava.io.StringReader;
importjavax.xml.parsers.SAXParserFactory;
importcom.example.utils.HttpDownloader;
importorg.xml.sax.InputSource;
importorg.xml.sax.XMLReader;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
public class MainActivity extendsActivity {
    /**Called when the activity is first created. */
    privateButton parseButton ;
    @Override
    public voidonCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        parseButton =(Button)findViewById(R.id.parseButton);
        parseButton.setOnClickListener(newParseButtonListener());
    }
    class ParseButtonListener implementsOnClickListener{
        public voidonClick(View v) {
            HttpDownloader hd = newHttpDownloader();
            String resultStr = hd.download("http://192.168.1.107:8081/voa1500/test.xml");
            System.out.println(resultStr);
            try{
                //创建一个SAXParserFactory
                SAXParserFactory factory =SAXParserFactory.newInstance();
                XMLReader reader =factory.newSAXParser().getXMLReader();
                //为XMLReader设置内容处理器
                reader.setContentHandler(newMyContentHandler());
                //开始解析文件
                reader.parse(new InputSource(newStringReader(resultStr)));
            }
            catch(Exception e){
                e.printStackTrace();
            }
        }
    }
}

以下的代码是MyContentHandler.java中的代码

packagecom.example.xml;
importorg.xml.sax.Attributes;
importorg.xml.sax.SAXException;
importorg.xml.sax.helpers.DefaultHandler;
public class MyContentHandler extendsDefaultHandler {
    String hisname, address, money, sex, status;
    String tagName;
    public void startDocument() throwsSAXException {
        System.out.println("````````begin````````");
    }
    public void endDocument() throwsSAXException {
        System.out.println("````````end````````");
    }
    public voidstartElement(String namespaceURI, String localName,
            String qName, Attributes attr) throwsSAXException {
        tagName =localName;
        if (localName.equals("worker")) {
            //获取标签的全部属性
            for (int i = 0; i < attr.getLength(); i++) {
                System.out.println(attr.getLocalName(i) + "=" +attr.getValue(i));
            }
        }
    }
    public voidendElement(String namespaceURI, String localName, String qName)
            throwsSAXException {
        //在workr标签解析完之后,会打印出所有得到的数据
        tagName = "";
        if (localName.equals("worker")) {
            this.printout();
        }
    }
    public void characters(char[] ch, int start, intlength)
            throwsSAXException {
        if (tagName.equals("name"))
            hisname = newString(ch, start, length);
        else if (tagName.equals("sex"))
            sex = newString(ch, start, length);
        else if (tagName.equals("status"))
            status = newString(ch, start, length);
        else if (tagName.equals("address"))
            address = newString(ch, start, length);
        else if (tagName.equals("money"))
            money = newString(ch, start, length);
    }
    private voidprintout() {
        System.out.print("name: ");
        System.out.println(hisname);
        System.out.print("sex: ");
        System.out.println(sex);
        System.out.print("status: ");
        System.out.println(status);
        System.out.print("address: ");
        System.out.println(address);
        System.out.print("money: ");
        System.out.println(money);
        System.out.println();
    }
}

以下的代码是FileUtils.java中的代码

packagecom.example.utils;
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importandroid.os.Environment;
public classFileUtils {
    privateString SDPATH;
    publicString getSDPATH() {
    returnSDPATH;
    }
    publicFileUtils() {
     //得到当前外部存储设备的目录
     ///SDCARD
     SDPATH = Environment.getExternalStorageDirectory() + "/";
    }
    /**
     * 在SD卡上创建文件
     * 
     * @throwsIOException
     */
    public File creatSDFile(String fileName) throwsIOException {
        File file = new File(SDPATH +fileName);
        file.createNewFile();
        returnfile;
    }
    /**
     * 在SD卡上创建目录
     * 
     * @paramdirName
     */
    publicFile creatSDDir(String dirName) {
        File dir = new File(SDPATH +dirName);
        dir.mkdirs();
        returndir;
    }
    /**
     * 判断SD卡上的文件夹是否存在
     */
    public booleanisFileExist(String fileName){
        File file = new File(SDPATH +fileName);
        returnfile.exists();
    }
    /**
     * 将一个InputStream里面的数据写入到SD卡中
     */
    publicFile write2SDFromInput(String path,String fileName,InputStream input){
        File file = null;
        OutputStream output = null;
        try{
            creatSDDir(path);
            file = creatSDFile(path +fileName);
            output = newFileOutputStream(file);
            byte buffer [] = new byte[4 * 1024];
            int len=-1;
            while((len=input.read(buffer)) != -1){
                //在这里使用另一个重载,防止流写入的问题.
                output.write(buffer,0,len);
            }
            output.flush();
        }
        catch(Exception e){
            e.printStackTrace();
        }
        finally{
                try{
                    output.close();
                }    
                catch(Exception e){
                    e.printStackTrace();
                }
        }
        returnfile;
    }
}

以下的代码是HttpDownloader.java中的代码

packagecom.example.utils;
importjava.io.BufferedReader;
importjava.io.File;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.net.HttpURLConnection;
importjava.net.MalformedURLException;
importjava.net.URL;
public classHttpDownloader {
    private URL url = null;
    /**
     * 根据URL下载文件,前提是这个文件当中的内容是文本,函数的返回值就是文件当中的内容
     * 1.创建一个URL对象
     * 2.通过URL对象,创建一个HttpURLConnection对象
     * 3.得到InputStram
     * 4.从InputStream当中读取数据
     * @paramurlStr
     * @return
     */
    publicString download(String urlStr) {
        StringBuffer sb = newStringBuffer();
        String line = null;
        BufferedReader buffer = null;
        try{
            //创建一个URL对象
            url = newURL(urlStr);
            //创建一个Http连接
            HttpURLConnection urlConn =(HttpURLConnection) url
                    .openConnection();
            //使用IO流读取数据
            buffer = new BufferedReader(newInputStreamReader(urlConn
                    .getInputStream()));
            while ((line = buffer.readLine()) != null) {
                sb.append(line);
            }
        } 
        catch(Exception e) {
            e.printStackTrace();
        } 
        finally{
            try{
                buffer.close();
            } 
            catch(Exception e) {
                e.printStackTrace();
            }
        }
        returnsb.toString();
    }
    /**
     * 该函数返回整形 -1:代表下载文件出错 0:代表下载文件成功 1:代表文件已经存在
     */
    public intdownFile(String urlStr, String path, String fileName) {
        InputStream inputStream = null;
        try{
            FileUtils fileUtils = newFileUtils();
            if (fileUtils.isFileExist(path +fileName)) {
                return 1;
            } 
            else{
                inputStream =getInputStreamFromUrl(urlStr);
                File resultFile =fileUtils.write2SDFromInput(path,fileName, inputStream);
                if (resultFile == null) {
                    return -1;
                }
            }
        } 
        catch(Exception e) {
            e.printStackTrace();
            return -1;
        } 
        finally{
            try{
                inputStream.close();
            } 
            catch(Exception e) {
                e.printStackTrace();
            }
        }
        return 0;
    }
    /**
     * 根据URL得到输入流
     * 
     * @paramurlStr
     * @return
     * @throwsMalformedURLException
     * @throwsIOException
     */
    publicInputStream getInputStreamFromUrl(String urlStr)
        throwsMalformedURLException, IOException {
        url = newURL(urlStr);
        HttpURLConnection urlConn =(HttpURLConnection) url.openConnection();
        InputStream inputStream =urlConn.getInputStream();
        returninputStream;
    }
}

以下的代码是activity_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"
    >
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
    <Button
         android:id="@+id/parseButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="开始解析XML"/>
</LinearLayout>

免责声明:文章转载自《Android学习笔记——xml》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇zip4j实现多线程压缩Switch重构处理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JAVA获取文件本身所在的磁盘位置

我们在做java开发(纯java程序,或者java web开发)时,经常会遇到需要读取配置文件的需求,如果我们将文件所在位置的信息直接写到程序中,例如:E:\workspace\JavaGUI\bin\com\util这个目录,这样虽然可行,但是,却产生了很大的局限性,因为读取的文件必须要要满足在E:\workspace\JavaGUI\bin\com\u...

c#读入,写入文本文件

老师留下的作业最后一条题目用到了,就百度下找到了例子修改成两个函数子程序方便使用. //********************************************** //函数名:ReadFile //功能:把指定文本内的数据读出并返回 //参数: FileName文件名 //返...

Qt 直接构建XML开发web services客户端程序

client.h client.cpp : XML发送与接收 其中 request.setHeader(QNetworkRequest::ContentTypeHeader, "text/xml;charset=utf-8" /*"application/x-www-form-urlencoded"*/); header的value值可以用soapui...

移动端 H5 拍照 从手机选择图片,移动端预览,图片压缩,图片预览,再上传服务器

前言:最近公司的项目在做全网营销,要做非微信浏览器的wap 站 的改版,其中涉及到的一点技术就是采用H5 选择手机相册中的图片,或者拍照,再将获取的图片进行压缩之后上传。 这个功能模块主要有这5点比较难:   1手机获取相册的图片文件,拍照的图片文件,通过js 的自带的img对象,获取图片对象。     2.图片的压缩,采用canvas 画布进行压缩图片,...

Java中如何获取spring中配置文件.properties中属性值

通过spring配置properties文件 1 2 3 4 5 6 7 8 9 <bean id="propertyConfigurer" class="com.hapishop.util.ProjectDBinfoConfigurer"> <property name="ignoreResourceNotFound"value...

当前日期+随机数+文件名(采用两种方法实现的工具类)

          多文件上传下载时,常常需要考虑上传统一文件多次,怎来精准的区别文件的名字,下面两种方法都可以实现1.第一种实现方式 //从服务端传过来的path路径截取文件名 String name = path.substring(39); SimpleDateFormat format = new SimpleDateFormat("yyyyMMd...