Android中XML解析
1 Xml解析
1.1 Dom解析
1.1.1 Dom解析原理
Dom解析,是把一個xml檔案全部讀入到記憶體之中進行解析的,利用JAVA自帶的函式parse進行解析,在呼叫parse方法後,xml的解析就已經完成,而xml檔案就以節點樹的形式儲存在了Document之中。我們只需要根據自己的需要在Document之中去訪問節點,獲取文字即可。
由於Dom解析需要把文字全部讀入記憶體之中,因此會消耗大量的記憶體,但是Dom解析比較方便去訪問各節點,並且也能夠從全域性上看出整個xml父子關係以及內部結構。在Android開發過程中不推薦使用,除非xml十分小。
1.1.2 Dom具體實現方法
Dom解析是按照W3C標準所制定的,解析過程:
1、 以檔案流的方式讀取xml檔案。
inputStream = this.getClass().getClassLoader().getResourceAsStream("beauties.xml");
在此要十分注意,beauties.xml必須放在src目錄下,不能是其子目錄。
2、 定義一個文件構建工廠。
Eg:DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
3、 定義一個檔案構建器
Eg:DocumentBuilder builder = factory.newDocumentBuilder();
4、 定義一個文件用來存放解析後的文件樹。
Eg:Document document = builder.parse(inputStream);
這時對xml文件解析已經完成,現在就可以從document這個變數中提取我們所需要的節點以及節點的屬性等。
5、 Element root = document.getDocumentElement();可以獲得此節點樹的根節點,在由此根據此根節點可以一步一步訪問我們所需的節點中的Text節點。
6、 在獲得我們需要的文字內容前,需要對節點標籤名字和型別進行判斷。
getNodeName獲得標籤名字,getNodeType獲得節點確切型別,
getNodeValue返回節點內容,如果是文字節點返回文字內容,否則返回null
getTextContent返回當前節點以及其子代節點的文字字串
解析的樣例程式碼:try {
DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(inputStream);
// 獲取根節點
Element root = document.getDocumentElement();
parse(root);
for (Beauty b : beautyList) {
result += b.toString();
}
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(result);
} catch (Exception e) {
e.printStackTrace();
}
private void parse(Element element) {
NodeList nodelist = element.getChildNodes();
int size = nodelist.getLength();
for (int i = 0; i < size; i++) {
Node element2 = (Node) nodelist.item(i);
String tagName = element2.getNodeName();
if (tagName.equals("beauty")
&& element2.getNodeType() == Document.ELEMENT_NODE) {
beauty = new Beauty();
if (element2.getNodeType() == Document.ELEMENT_NODE) {
parse((Element) element2);//遞迴進行訪問
}
beautyList.add(beauty);
}
if (tagName.equals("name")) {
String name = element2.getTextContent();
beauty.setName(name);
}
if (tagName.equals("age")) {
String age = element2.getTextContent();
beauty.setAge(age);
}
}
}
1.2 Pull解析
1.2.1 Pull解析原理
Pull解析是Android自帶的一種解析方式。使用的是事件觸發的方式,他不需要把所有xml文件都讀入進記憶體之中,而事件的型別是以整數的形式表示。在使用Pull解析時可以隨時終止解析,因此當我們找到我們所需內容後,則可以終止解析。由於Pull解析是Android自帶的一種解析方式,並且不會把所有xml檔案的內容讀入記憶體,達到了對記憶體的較低消耗,所以面對手機客戶端的應用開發,這是一種十分推崇的方式。對於效率優先的這種方式也有自己的不足,就是不能很好的瞭解xml檔案的內部結構。
1.2.2 Pull解析實現方法
1、 以檔案流的方式讀取xml檔案。
InputStream inputStream = this.getClassLoader().getResourceAsStream("person.xml");
注意:person.xml檔案也必須存在src目錄下,不能是其子目錄。
2、 獲取一個XmlPullParser
XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
XmlPullParser parser = xmlPullParserFactory.newPullParser();
3、 設定輸入流編碼方式
parser.setInput(inputStream, "UTF-8");此處以UTF-8為例。
4、 獲取當前事件型別
int eventType = parser.getEventType();
具有的型別有:XmlPullParser.END_DOCUMENT,XmlPullParser.START_TAG,XmlPullParser.END_TAG,XmlPullParser.START_DOCUMENT等事件型別。
5、 根據其事件型別進行不同的處理,
getAttributeValue獲取屬性值,getName獲取元素節點名稱。
parser.next()觸發下一個 事件。
樣例程式碼:其中解析出的每一項都並列的顯示在列表之中。
try{
//以流的形式獲取SRC目錄下的xml檔案(此檔案父親資料夾必須是SRC)
InputStream inputStream = this.getClassLoader().getResourceAsStream("person.xml");
//獲取一個XmlPullParser
XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
XmlPullParser parser = xmlPullParserFactory.newPullParser();
//設定輸入流已經編碼方式
parser.setInput(inputStream, "UTF-8");
//獲取當前事件型別
int eventType = parser.getEventType();
int i = -1;
String[] data = new String[20];
Person person = null;
while(XmlPullParser.END_DOCUMENT!=eventType){
String nodeName = parser.getName();
switch(eventType){
case XmlPullParser.START_TAG:
if(nodeName.equals("s")||nodeName.equals("c")){
i++;
data[i] = parser.getAttributeValue(0)+" "+parser.getAttributeValue(1);
}
break;
case XmlPullParser.END_TAG:
if(nodeName.equals("s")||nodeName.equals("c")&&person!=null){
persons.add(person);
}
break;
default :
break;
}
//手動觸發下一個事件
eventType = parser.next();
}
for (; i < 20; i++) {
data[i] = "列表項" + i;
}
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, R.layout.main, data);
this.setListAdapter(arrayAdapter);
}
catch (Exception e) {
System.out.println("-------->出現異常");
e.printStackTrace();
}
1.3 Sax解析
1.3.1 Sax解析原理
順序的對文件進行掃描,當掃描到文件(Document)開始與結束、元素(Element)開始與結束等地方時通知事件處理函式,由事件處理函式做相應動作,然後繼續同樣的掃描,直至文件結束。
在解析工程中主要產生以下事件:
start document,start element,characters,end element,end document
與之相對應的有一下幾種方式:
Void startDocument() //文件開始處理方式
Void endDocument() //文件結束處理方式
Void startElement(String uri,String localName,String qName,Attibutes atts) //元素開始處理方式,localName是不帶字首的名字,qName是帶字首的名字。
Void endElement(String uri,String localName,String qName) //元素結束處理方式
Void character(char[] ch,int start int length)
1.3.2 Sax實現方法
1、 以檔案流的方式讀取檔案,同pull解析。
2、 寫一個類繼承DefaulterHandler,實現自己的事件處理方法。
3、 獲取一個Sax解析器
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
4、 開始解析
具體程式碼實現,由於SAX解析原理和Pull解析很相似,不同在於,SAX解析器,解析過程是自動的,不能人工控制,而Pull可以主動的去獲取事件,所以Pull可以隨時在獲取了需要的條件後結束解析。所以我沒有現實Sax解析的具體程式碼。相關推薦
Android中XML解析
1 Xml解析1.1 Dom解析1.1.1 Dom解析原理Dom解析,是把一個xml檔案全部讀入到記憶體之中進行解析的,利用JAVA自帶的函式parse進行解析,在呼叫parse方法後,xml的解析就已經完成,而xml檔案就以節點樹的形式儲存在了Doc
Android中XML文件的序列化生成與解析
eval test director 南海 attribute trac cli found dir 首先,我把Person的實體類 package net.loonggg.test; public class Person { privat
Android學習記錄(1)—Android中XML檔案的序列化生成與解析
xml檔案是非常常用的,在android中json和xml是非常常用的兩種封裝資料的形式,從伺服器中獲取資料也經常是這兩種形式的,所以學會生成和解析xml和json是非常有用的,json相對來說是比較簡單的,咱不做介紹了,這裡給大家講一下xml的序列化生成和解析。不廢話了,
java和android中sax解析xml
學習安卓sax解析xml時,想用java寫一個解析某個xml檔案的Handler,程式碼如下: import org.xml.sax.*; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parser
cocos2d-x 中XML解析與數據存儲
lba false 網上 unsigned failed popu new ccm cfile 一不小心就玩了一周的遊戲了。哎。玩的時候時間過得總是這麽快。。。 於是今天決定看一下之前不怎麽非常熟悉的XML;(之前做遊戲時數據的儲存用到過XML,但這塊是還有一個同事在做
Android中XML的名稱空間、自定義屬性
基本概念介紹 名稱空間(namespace) XML 名稱空間提供避免元素命名衝突的方法。 打個比方,A學校有名學生叫做林小明,B學校也有名學生叫林小明,那我們如何識別這兩名擁有相同名字的同學呢?這時候名稱空間就派上用場了。A和B此時就可以被當成是名稱空間了。也就是說,
java中URI,URL,URL介紹及Android中Uri解析
一、URI 1.1 定義 在電腦術語中,統一資源識別符號(Uniform Resource Identifier,即URI)是一個用於標識某一網際網路資源名稱的字串。 該種標識允許使用者對任何(包括本地和網際網路)的資源通過特定的協議進行互動操作。 1.2 組成 一般格式為:
Android實現XML解析技術
本文介紹在Android平臺中實現對XML的三種解析方式。 XML在各種開發中都廣泛應用,Android也不例外。作為承載資料的一個重要角色,如何讀寫XML成為Android開發中一項重要的技能。 在Android中,常見的XML解析器分別為DOM解析器、SAX
Android中xml佈局檔案中使用include引入佈局進行復用(解決使用include佈局重疊,顏色設定無效問題)
使用include引入佈局的作用 提取重複的佈局程式碼,方便進行復用 如何使用 比如我們想要線上性佈局中建立三塊需要複用的佈局headview、centerview、butto
Python中xml解析
XML指可擴充套件標記語言(extensibleMarkup Language),被設計用來傳輸和儲存資料python有3種方法解析XML:SAX,DOM以及ElemenTree1、SAX(simple API for XML)python標準庫包含SAX解析器,SAX用事件
android 中XML和物件轉換利器Xstream的使用
//JettisonMappedXmlDriver 轉換的字串 {"list":{"student":[{"id":1,"name":"haha","email":"email","address":"address","birthday":[{},"2010-11-22"]}]},"student"
Android中xml實現效果二:邊框效果
邊框效果是通過定義一個背景為xml檔案來實現的; #1 menu_border.xml 白色邊框效果,可修改color的值來改變邊框顏色; <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http:/
Android APK XML解析與反編譯方法
APK中的XML為何不能直接開啟,是否只是簡單的二進位制檔案,難道被加密了?為什麼AXMLPrinter2反編譯的時候竟然報錯了,如何解決? java.lang.ArrayIndexOutOfBoundsException: 128 at android.c
android中xml tools屬性詳解
第一部分 安卓開發中,在寫佈局程式碼的時候,ide可以看到佈局的預覽效果。 但是有些效果則必須在執行之後才能看見,比如這種情況:TextView在xml中沒有設定任何字元,而是在activity中設定了text。因此為了在ide中預覽效果,
android中json解析及使用 (下)
android中 edi token ims stream 一個 ace follow ipp 接上文 七、通過JSONTokener來解析json文本 7.1、將json文本解析為對象 我們可以通過JSONTokener的nextValue()來獲得JSON
Android中三種常用解析XML的方式(DOM、SAX、PULL)簡介及區別
字符串 lan win name屬性 Coding 空間 toc log fin XML在各種開發中都廣泛應用,Android也不例外。作為承載數據的一個重要角色,如何讀寫XML成為Android開發中一項重要的技能。今天就由我向大家介紹一下在Android平臺下幾種常見的
android中常用的xml生成與解析
總結了一下解析XML的三種方式。下圖為要解析的XML的格式。 解析了兩種方式的XML,一種是檔案,另一種是流。 程式碼中用到的許多的類是我虛構出來的,例如在第二種解析中用到的User類。使用者應該先寫這個類,寫出他們的屬性,並寫get和set方法才可以的。 <?xml
Android中使用pull解析xml檔案
Android解析xml檔案的時候,自己推薦是使用pull的方式來解析xml資原始檔,pull方式又有兩種,分別是XmlPullParser和XmlResourceParser兩種。下面來分別介紹。 一: XmlPullParser方式進行佈局解析。
Android 中使用Pull解析XML檔案
解析XML檔案是非常常用的功能,在Android客戶端中,經常與伺服器通訊都需要xml檔案的支援,我們這裡介紹一個 簡單的xml檔案的解析,就是使用android中的pull方法進行解析。在java中,有dom解析和sax解析,這個pull解析有些類 似於sax解析,他也是
Android中幾種xml解析的比較
Andorid中xml解析方法有以下三種:DOM解析、SAX解析、還有Pull解析。今天我們就來比較一下幾種解析方法的優缺點 DOM 解析 優點: 1.XML 樹在記憶體中完整儲存,因此可以直接修改其資料和結構. 2.可以通過該解析器隨時訪問XML 樹中的任何一個節點. 3