zoukankan      html  css  js  c++  java
  • Android学习笔记——xml

    转自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.        对文档进行解析,将每个事件发送给处理程序。

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

    package com.example.xml;
    
    import java.io.StringReader;
    
    import javax.xml.parsers.SAXParserFactory;
    
    import com.example.utils.HttpDownloader;
    
    import org.xml.sax.InputSource;
    import org.xml.sax.XMLReader;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class MainActivity extends Activity {
        /** Called when the activity is first created. */
        private Button parseButton ;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            parseButton = (Button)findViewById(R.id.parseButton);
            parseButton.setOnClickListener(new ParseButtonListener());
        }
        
        class ParseButtonListener implements OnClickListener{
    
            public void onClick(View v) {
                HttpDownloader hd = new HttpDownloader();
                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(new MyContentHandler());
                    //开始解析文件
                    reader.parse(new InputSource(new StringReader(resultStr)));
                }
                catch(Exception e){
                    e.printStackTrace();
                }
            }
            
        }
    }

    以下的代码是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 hisname, address, money, sex, status;
        String tagName;
    
        public void startDocument() throws SAXException {
            System.out.println("````````begin````````");
        }
    
        public void endDocument() throws SAXException {
            System.out.println("````````end````````");
        }
    
        public void startElement(String namespaceURI, String localName,
                String qName, Attributes attr) throws SAXException {
            tagName = localName;
            if (localName.equals("worker")) {
                //获取标签的全部属性
                for (int i = 0; i < attr.getLength(); i++) {
                    System.out.println(attr.getLocalName(i) + "=" + attr.getValue(i));
                }
            }
        }
    
        public void endElement(String namespaceURI, String localName, String qName)
                throws SAXException {
            //在workr标签解析完之后,会打印出所有得到的数据
            tagName = "";
            if (localName.equals("worker")) {
                this.printout();
            }
        }
        public void characters(char[] ch, int start, int length)
                throws SAXException {
            if (tagName.equals("name"))
                hisname = new String(ch, start, length);
            else if (tagName.equals("sex"))
                sex = new String(ch, start, length);
            else if (tagName.equals("status"))
                status = new String(ch, start, length);
            else if (tagName.equals("address"))
                address = new String(ch, start, length);
            else if (tagName.equals("money"))
                money = new String(ch, start, length);
        }
    
        private void printout() {
            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中的代码

    package com.example.utils;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import android.os.Environment;
    
    public class FileUtils {
        private String SDPATH;
        public String getSDPATH() {
        return SDPATH;
        }
        
        public FileUtils() {
         //得到当前外部存储设备的目录
         // /SDCARD
         SDPATH = Environment.getExternalStorageDirectory() + "/";
        }
        
        /**
         * 在SD卡上创建文件
         * 
         * @throws IOException
         */
        public File creatSDFile(String fileName) throws IOException {
            File file = new File(SDPATH + fileName);
            file.createNewFile();
            return file;
        }
     
        /**
         * 在SD卡上创建目录
         * 
         * @param dirName
         */
        public File creatSDDir(String dirName) {
            File dir = new File(SDPATH + dirName);
            dir.mkdirs();
            return dir;
        }
        
        /**
         * 判断SD卡上的文件夹是否存在
         */
        public boolean isFileExist(String fileName){
            File file = new File(SDPATH + fileName);
            return file.exists();
        }
     
        /**
         * 将一个InputStream里面的数据写入到SD卡中
         */
        public File write2SDFromInput(String path,String fileName,InputStream input){
            File file = null;
            OutputStream output = null;
            try{
                creatSDDir(path);
                file = creatSDFile(path + fileName);
                output = new FileOutputStream(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();
                    }
            }
            return file;
        }
    }

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

    package com.example.utils;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    
    public class HttpDownloader {
        private URL url = null;
        /**
         * 根据URL下载文件,前提是这个文件当中的内容是文本,函数的返回值就是文件当中的内容
         * 1.创建一个URL对象
         * 2.通过URL对象,创建一个HttpURLConnection对象
         * 3.得到InputStram
         * 4.从InputStream当中读取数据
         * @param urlStr
         * @return
         */
        
        public String download(String urlStr) {
            StringBuffer sb = new StringBuffer();
            String line = null;
            BufferedReader buffer = null;
            try {
                // 创建一个URL对象
                url = new URL(urlStr);
                // 创建一个Http连接
                HttpURLConnection urlConn = (HttpURLConnection) url
                        .openConnection();
                // 使用IO流读取数据
                buffer = new BufferedReader(new InputStreamReader(urlConn
                        .getInputStream()));
                while ((line = buffer.readLine()) != null) {
                    sb.append(line);
                }
            } 
            catch (Exception e) {
                e.printStackTrace();
            } 
            finally {
                try {
                    buffer.close();
                } 
                catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return sb.toString();
        }
     
        /**
         * 该函数返回整形 -1:代表下载文件出错 0:代表下载文件成功 1:代表文件已经存在
         */
        public int downFile(String urlStr, String path, String fileName) {
            InputStream inputStream = null;
            try {
                FileUtils fileUtils = new FileUtils();
       
                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得到输入流
         * 
         * @param urlStr
         * @return
         * @throws MalformedURLException
         * @throws IOException
         */
        public InputStream getInputStreamFromUrl(String urlStr)
            throws MalformedURLException, IOException {
            url = new URL(urlStr);
            HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
            InputStream inputStream = urlConn.getInputStream();
            return inputStream;
        }
    }

    以下的代码是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>
  • 相关阅读:
    探索ASP.NET MVC5系列之~~~3.视图篇(下)---包含常用表单和暴力解猜防御
    探索ASP.NET MVC5系列之~~~2.视图篇(上)---包含XSS防御和异步分部视图的处理
    SVN:Previous operation has not finished; run 'cleanup' if it was interrupted
    探索ASP.NET MVC5系列之~~~1.基础篇---必须知道的小技能
    MVC:The name 'Scripts' does not exist in the current context
    Dapper.Contrib:GetAsync<T> only supports an entity with a [Key] or an [ExplicitKey] property
    Dapper扩展之~~~Dapper.Contrib
    AutoFac在项目中的应用
    群福利:百度云管家-本地SVIP
    【声明】前方不设坑位,不收费!~ 我为NET狂官方学习计划
  • 原文地址:https://www.cnblogs.com/tonglin0325/p/4589609.html
Copyright © 2011-2022 走看看