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