• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Android XML DOM解析SAX解析

    標簽: android學習總結

    聲明:內容大部分參考自網友博客。個人只是做了小小的總結
    在這里插入圖片描述
    在這里插入圖片描述
    我個人覺得可以用MVC模式去看待解析xml文件的實現:
    在這里插入圖片描述

    下面是具體實現:
    首先編寫一個xml的數據文件存放在res/raw文件目錄下:

    <?xml version="1.0" encoding="utf-8"?>
    <users>
        <beauty>
            <name>范冰冰</name>
            <age>28</age>
        </beauty>
        <beauty>
            <name>楊冪</name>
            <age>23</age>
        </beauty>
    </users>
    

    1.編寫模型代碼:

    package com.example.sax;
    
    public class User {
        private String name;
        private String age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAge() {
            return age;
        }
    
        public void setAge(String age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "美女資料 [年齡=" + age + ", 姓名=" + name + "]";
        }
    
    }
    
    
    package com.example.sax;
    import java.util.ArrayList;
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    
    public class MyHandler extends DefaultHandler {
        //聲明一個裝載Beauty類型的List
        private ArrayList<User> mList;
        //聲明一個Beauty類型的變量
        private User beauty;
        //聲明一個字符串變量
        private String content;
    
        /**
         * MySaxHandler的構造方法
         *
         * @param list 裝載返回結果的List對象
         */
        public MyHandler(ArrayList<User> list){
            this.mList = list;
        }
    
        /**
         * 當SAX解析器解析到XML文檔開始時,會調用的方法
         */
        @Override
        public void startDocument() throws SAXException {
            super.startDocument();
        }
    
        /**
         * 當SAX解析器解析到XML文檔結束時,會調用的方法
         */
        @Override
        public void endDocument() throws SAXException {
            super.endDocument();
        }
    
        /**
         * 當SAX解析器解析到某個屬性值時,會調用的方法
         * 其中參數ch記錄了這個屬性值的內容
         */
        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException {
            super.characters(ch, start, length);
            content = new String(ch, start, length);
        }
    
        /**
         * 當SAX解析器解析到某個元素開始時,會調用的方法
         * 其中localName記錄的是元素屬性名
         */
        @Override
        public void startElement(String uri, String localName, String qName,
                                 Attributes attributes) throws SAXException {
            super.startElement(uri, localName, qName, attributes);
    
            if("beauty".equals(localName)){
                beauty = new User(); //新建Beauty對象
            }
        }
    
        /**
         * 當SAX解析器解析到某個元素結束時,會調用的方法
         * 其中localName記錄的是元素屬性名
         */
        @Override
        public void endElement(String uri, String localName, String qName)
                throws SAXException {
            super.endElement(uri, localName, qName);
    
            if("name".equals(localName)){
                beauty.setName(content);
            }else if("age".equals(localName)){
                beauty.setAge(content);
            }else if("beauty".equals(localName)){
                mList.add(beauty); //將Beauty對象加入到List中
            }
        }
    
    }
    

    2.視圖編輯

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <TextView
            android:id="@+id/sax"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    

    3.控制器代碼:

    package com.example.sax;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.content.res.AssetManager;
    import android.os.Bundle;
    import java.io.InputStream;
    import java.util.ArrayList;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    import org.xml.sax.InputSource;
    
    import org.xml.sax.XMLReader;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity {
    
        //聲明裝載Beauty對象的List
        private ArrayList<User> beautyList;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //初始化beautyList鏈表
            if(beautyList == null){
                beautyList = new ArrayList<User>();
            }
    
            doMyMission();
    
            setupViews();
        }
    
        /**
         * 使用SAX解析器解析XML文件的方法
         */
        private void doMyMission(){
            try {
                //獲取AssetManager管理器對象
                AssetManager as = this.getAssets();
                //通過AssetManager的open方法獲取到beauties.xml文件的輸入流
    
                InputStream is=this.getResources().openRawResource(R.raw.users);//這個是關鍵,網上代碼不會出現
    
    
                //通過獲取到的InputStream來得到InputSource實例
                InputSource is2 = new InputSource(is);
                //使用工廠方法初始化SAXParserFactory變量spf
                SAXParserFactory spf = SAXParserFactory.newInstance();
                //通過SAXParserFactory得到SAXParser的實例
                SAXParser sp = spf.newSAXParser();
                //通過SAXParser得到XMLReader的實例
                XMLReader xr = sp.getXMLReader();
                //初始化自定義的類MySaxHandler的變量msh,將beautyList傳遞給它,以便裝載數據
                MyHandler msh = new MyHandler(beautyList);
                //將對象msh傳遞給xr
                xr.setContentHandler(msh);
                //調用xr的parse方法解析輸入流
                xr.parse(is2);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 將解析結果輸出到界面的方法
         */
        private void setupViews(){
            String result = "";
            for (User b : beautyList) {
                result += b.toString();
            }
    
            TextView textView = (TextView) findViewById(R.id.sax);
            textView.setText(result);
        }
    
    }
    
    

    在這里插入圖片描述
    在這里插入圖片描述

    下面是具體實現:
    首先編寫一個xml的數據文件存放在res/raw文件目錄下:

    <?xml version="1.0" encoding="UTF-8"?>
    <persons>
        <person id="23">
            <name>liming</name>
            <age>30</age>
        </person>
        <person id="20">
            <name>lixiangmei</name>
            <age>25</age>
        </person>
    </persons>
    

    1.編寫模型代碼:

    package com.example.dom;
    
    public class Person {
        int id;
        String name;
        int age;
    
        public void setId(int id)
        {
            this.id=id;
        }
        public int getId()
        {
            return id;
        }
        public void setName(String name)
        {
            this.name=name;
        }
        public String getName()
        {
            return name;
        }
        public void setAge(int age)
        {
            this.age=age;
        }
        public int getAge()
        {
            return age;
        }
    }
    
    
    package com.example.dom;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    
    /**
     * Created by zhangmiao on 2016/12/14.
     */
    public class AnalyzeDOM {
    
        public static List<Person> readXML(InputStream inputStream) {
            List<Person> persons = new ArrayList<>();
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            try {
                DocumentBuilder builder = factory.newDocumentBuilder();
                Document dom = builder.parse(inputStream);
                Element root = dom.getDocumentElement();
                NodeList items = root.getElementsByTagName("person");
                for (int i = 0; i < items.getLength(); i++) {
                    Person person = new Person();
                    Element personNode = (Element) items.item(i);
                    person.setId(new Integer(personNode.getAttribute("id")));
                    NodeList childNodes = personNode.getChildNodes();
                    for (int j = 0; j < childNodes.getLength(); j++) {
                        Node node = childNodes.item(j);
                        if (node.getNodeType() == Node.ELEMENT_NODE) {
                            Element childNode = (Element) node;
                            if ("name".equals(childNode.getNodeName())) {
                                person.setName(childNode.getFirstChild().getNodeValue());
                            } else if ("age".equals(childNode.getNodeName())) {
                                person.setAge(new Short(childNode.getFirstChild().getNodeValue()));
                            }
                        }
                    }
                    persons.add(person);
                }
                inputStream.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return persons;
        }
    }
    
    

    2.視圖編輯

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <TextView
            android:id="@+id/text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
        <Button
            android:id="@+id/dom_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="here"
            android:onClick="onClick"/>
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    

    3.控制器代碼:

    package com.example.dom;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    import java.io.InputStream;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity {
    
       // private static final String TAG = "AnalyzeXMLDemo";
    
        private TextView mTextView;
    
       private Button dom;
        private InputStream inputStream;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mTextView = (TextView) findViewById(R.id.text);
            dom = (Button)findViewById(R.id.dom_button);
        }
        public void onClick(View v) {
            String result = "";
            inputStream = getResources().openRawResource(R.raw.itcase);
            switch (v.getId()) {case R.id.dom_button:
                result += "--------- DOM ---------" + "\n";
                if (inputStream == null) {
                    result = "inputStream is null";
                } else {
                    List<Person> personList = AnalyzeDOM.readXML(inputStream);
                    if (personList != null) {
                        for (int i = 0; i < personList.size(); i++) {
                            String message = "id = " + personList.get(i).getId() + " , name = " + personList.get(i).getName()
                                    + " , age = " + personList.get(i).getAge() + ".\n";
                            result += message;
                        }
                    }
                }
                mTextView.setText(result);
                break;default:
                break;
            }
        }
    
    }
    
    
    版權聲明:本文為c1776167012原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/c1776167012/article/details/104968461

    智能推薦

    android 如何使用SAX解析XML

    今天,簡單講講android如何使用SAX解析XML 。 昨天,我看代碼時,看到了解析xml文檔的代碼,是使用SAX解析XML。但是我卻不會使用SAX,于是在網上查找資料,最終解決了問題。這里記錄一下。 解析XML的方式有很多種,大家比較熟悉的可能就是DOM解析。 DOM(文件對象模型)解析:解析器讀入整個文檔,然后構建一個駐留內存的樹結構,然后代碼就可以根據DOM接口來操作這個樹結構了。   優...

    Java中xml解析 SAX、PULL、DOM

    目錄   一,什么是XML: 二,XML的解析 一,什么是XML: 定義:XML指的是可擴展標記語言,主要用來傳輸和存儲數據。 XML主要語法規則: XML標簽需要用戶自定義 XML標簽使用時要關閉<標簽名> </標簽名>成對存在 XML標簽對區分大小寫 XML標簽必須正確的嵌套 XML文檔有且只有一個根元素 XML的屬性值要加引號 XML中的空格換行符等會被當做...

    XML的DOM和SAX解析方式

    昨天抽取并解析了一大批從微信鉤子收取到的小程序消息,它們都是用很復雜的XML表示的。平常不是很接觸XML,本文就隨便說說XML的兩種解析方式。 DOM解析方式 DOM即文檔對象模型(document object model)。根據W3C的描述,DOM是一套用于HTML和XML文檔的標準接口,它定義了文檔的邏輯結構,以及訪問或操作文檔的方式。 DOM Parser會將文檔解析為包含元素、屬性和文本...

    XML解析___使用Dom or使用Sax

    xml解析方式分為兩種,dom和sax dom:(Document Object Model,即對文檔對象模型)是W3C組織推薦的處理XML的一種方式 Sax:(Simple API for  XML)不是官方標準,但它是xml社區事實上的標準,幾乎所有的xml解析器都支持它。   XML解析開發包 Jaxp、Jdom、dom4J   使用DOM解析XML介紹 DOM...

    Android知識點 800 —— XML文件解析,SAX解析

    SAX的全稱是Simple APIs for XML,也即XML簡單應用程序接口。與DOM不同,SAX提供的訪問模式是一種順序模式,這是一種快速讀寫XML數據的方式。當使用SAX分析器對XML文檔進行分析時,會觸發一系列事件,并**相應的事件處理函數,應用程序通過這些事件處理函數實現對XML文檔的訪問,因而SAX接口也被稱作事件驅動接口。 優點: 1、采用事件驅動模式,按節點,一邊讀一邊解析。對內...

    猜你喜歡

    XML文檔解析技術之SAX解析與DOM解析

    一、SAX解析              SAX解析xml的方式是一種快速解析xml文檔的手段,優點是效率高,適用于解析量不大的xml文檔。              使用案例: 使用sax的方式將如下的xml文檔的用戶信息解析出來。   ...

    Xml 解析:(sax 解析)

    sax解析的原理()      解析xml有兩種技術 dom 和sax      根據xml的層級結構在內存中分配一個樹形結構      把xml中標簽,屬性,文本封裝成對象      sax方式:事件驅動,邊讀邊解析   &nb...

    XML介紹及DOM解析&SAX解析——學習筆記

    目錄 一、XML簡介 (1)XML和HTML (2)什么是XML 二、XML元素VS節點 三、DOM方式解析XML原理 四、SAX方式解析XML原理 五、JDOM工具解析 六、DOM4J工具解析 一、XML簡介 (1)XML和HTML          XML   被設計用來傳輸和存儲數據。 &nb...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    精品国产乱码久久久久久蜜桃不卡