androidxml解析pull
Ⅰ android裡面怎麼解析xml
Android解析xml文件總共有三種方法,分別是:
SAX解析XML文件:SAX是一個解析速度快並且佔用內存少的xml解析器,非常適合用於Android等移動設備。SAX解析XML文件採用的是事件驅動,也就是說,它並不需要解析完整個文檔,在按內容順序解析文檔的過程中,SAX會判斷當前讀到的字元是否合法XML語法中的某部分,如果符合就會觸發事件。所謂事件,其實就是一些回調(callback)方法,這些方法(事件)定義在ContentHandler介面。如下代碼:
java">publicstaticList<Person>readXML(InputStreaminStream){
try{
//創建解析器
SAXParserFactoryspf=SAXParserFactory.newInstance();
SAXParsersaxParser=spf.newSAXParser();
//設置解析器的相關特性,true表示開啟命名空間特性
saxParser.setProperty("http://xml.org/sax/features/namespaces",true);
XMLContentHandlerhandler=newXMLContentHandler();
saxParser.parse(inStream,handler);
inStream.close();
returnhandler.getPersons();
}catch(Exceptione){
e.printStackTrace();
}
returnnull;
}
//SAX類:DefaultHandler,它實現了ContentHandler介面。在實現的時候,只需要繼承該類,重載相應的方法即可。
{
privateList<Person>persons=null;
privatePersoncurrentPerson;
privateStringtagName=null;//當前解析的元素標簽
publicList<Person>getPersons(){
returnpersons;
}
//接收文檔開始的通知。當遇到文檔的開頭的時候,調用這個方法,可以在其中做一些預處理的工作。
@Override
publicvoidstartDocument()throwsSAXException{
persons=newArrayList<Person>();
}
//接收元素開始的通知。當讀到一個開始標簽的時候,會觸發這個方法。其中namespaceURI表示元素的命名空間;
//localName表示元素的本地名稱(不帶前綴);qName表示元素的限定名(帶前綴);atts表示元素的屬性集合
@Override
publicvoidstartElement(StringnamespaceURI,StringlocalName,StringqName,Attributesatts)throwsSAXException{
if(localName.equals("person")){
currentPerson=newPerson();
currentPerson.setId(Integer.parseInt(atts.getValue("id")));
}
this.tagName=localName;
}
//接收字元數據的通知。該方法用來處理在XML文件中讀到的內容,第一個參數用於存放文件的內容,
//後面兩個參數是讀到的字元串在這個數組中的起始位置和長度,使用newString(ch,start,length)就可以獲取內容。
@Override
publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXException{
if(tagName!=null){
Stringdata=newString(ch,start,length);
if(tagName.equals("name")){
this.currentPerson.setName(data);
}elseif(tagName.equals("age")){
this.currentPerson.setAge(Short.parseShort(data));
}
}
}
//接收文檔的結尾的通知。在遇到結束標簽的時候,調用這個方法。其中,uri表示元素的命名空間;
//localName表示元素的本地名稱(不帶前綴);name表示元素的限定名(帶前綴)
@Override
publicvoidendElement(Stringuri,StringlocalName,Stringname)throwsSAXException{
if(localName.equals("person")){
persons.add(currentPerson);
currentPerson=null;
}
this.tagName=null;
}
}DOM解析XML文件: DOM解析XML文件時,會將XML文件的所有內容讀取到內存中,然後允許您使用DOM API遍歷XML樹、檢索所需的數據。使用DOM操作XML的代碼看起來比較直觀,並且,在某些方面比基於SAX的實現更加簡單。但是,因為DOM需要將XML文件的所有內容讀取到內存中,所以內存的消耗比較大,特別對於運行Android的移動設備來說,因為設備的資源比較寶貴,所以建議還是採用SAX來解析XML文件,當然,如果XML文件的內容比較小採用DOM是可行的。
Pull解析器解析XML文件: Pull解析器的運行方式與 SAX 解析器相似。它提供了類似的事件,如:開始元素和結束元素事件,使用parser.next()可以進入下一個元素並觸發相應事件。事件將作為數值代碼被發送,因此可以使用一個switch對感興趣的事件進行處理。當元素開始解析時,調用parser.nextText()方法可以獲取下一個Text類型元素的值
Ⅱ 請問怎麼用android pull解析web傳回的xml文件
2.如果是從網路回傳回的XML文件,我更推薦以數據流的方式輸入到內存,使用Android的XmlPullParser解析器對其進行解析,下面我寫一個簡單的例子方便你理解 Person.xml <persons>
<person id="23">
<name>liming</name>
<age>30</age></person><person id="20">
<name>lixiangmei</name>
<age>25</age></person></persons> 使用Pull解析器的邏輯: public static List<Person> getPersons(InputStream inStream) throws Throwable{ //將XML文件以數據流的方式輸入
List<Person> persons = null;
Person person = null;
XmlPullParser parser = Xml.newPullParser(); //創建Pull解析器對象實例
parser.setInput(inStream, "UTF-8"); //設置解析的編碼格式為utf-8編碼
int eventType = parser.getEventType(); //因為可以手動的去獲取事件,以控制解析XML文檔的過程, //所以我們可以在循環中不斷的提取事件,根據事件的類型做相應的邏輯處理
while(eventType!=XmlPullParser.END_DOCUMENT){
switch (eventType) {
case XmlPullParser.START_DOCUMENT: //遇到XML文檔的根元素,即<persons>這個標簽
persons = new ArrayList<Person>(); //創建person集合break;case XmlPullParser.START_TAG: //遇到XML文檔中的標簽起始元素
String name = parser.getName();
if("person".equals(name)){
person = new Person();
person.setId(new Integer(parser.getAttributeValue(0)));}if(person!=null){
if("name".equals(name)){
person.setName(parser.nextText());//注意,是獲取<person>這個標簽的文本信息,調用nextText()這個方法}if("age".equals(name)){
person.setAge(new Short(parser.nextText()));}}break;case XmlPullParser.END_TAG://遇到XML文檔中的結束標簽元素
if("person".equals(parser.getName())){
persons.add(person);
person = null; //這句話要注意,將這個person類型對象的引用置空,因為在循環中要繼續遍歷,生成新的person對象}break;}eventType = parser.next(); //不斷提取事件}return persons;}
3.以上的Demo雖然小
Ⅲ 在android中怎麼使用pullparse解析.xml文件
Pull解析器的運行方式與 SAX 解析器相似。它提供了類似的事件,如:開始元素和結束元素事件,使用parser.next()可以進入下一個元素並觸發相應事件。跟SAX不同的是, Pull解析器產生的事件是一個數字,而非方法,因此可以使用一個switch對感興趣的事件進行處理。當元素開始解析時,調用parser.nextText()方法可以獲取下一個Text類型節點的值。
下面我們通過Demo例子來介紹如何使用PULL機制來解析XML文件。先看下如下工程的目錄結構:
按以下步驟進行操作:
[1] 新建一個XML文件,命名為student.xml。同時把XML文件放置到assets目錄下。student.xml文件的內容如下:
[html] view plain
<?xml version="1.0" encoding="utf-8"?>
<students>
<student id="20110806100">
<name>小明</name>
<age>22</age>
<sex>男</sex>
</student>
<student id="20110806101">
<name>小李</name>
<age>24</age>
<sex>男</sex>
</student>
<student id="20110806102">
<name>小麗</name>
<age>21</age>
<sex>女</sex>
</student>
</students>
[2] 根據XML文件中的節點目錄,創建一個相對應的實體類,來保存解析的相應信息。在包:com.andyidea.entity下新建Student.java類。
[html] view plain
package com.andyidea.entity;
public class Student {
private String id;
private String name;
private int age;
private String sex;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
[3] 定義一個使用PULL解析XML文件的工具類:ParserByPULL.java。
[html] view plain
package com.andyidea.util;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import android.util.Xml;
import com.andyidea.entity.Student;
public class ParserByPULL {
//採用XmlPullParser來解析XML文件
public static List<Student> getStudents(InputStream inStream) throws Throwable
{
List<Student> students = null;
Student mStudent = null;
//========創建XmlPullParser,有兩種方式=======
//方式一:使用工廠類XmlPullParserFactory
XmlPullParserFactory pullFactory = XmlPullParserFactory.newInstance();
XmlPullParser parser = pullFactory.newPullParser();
//方式二:使用Android提供的實用工具類android.util.Xml
//XmlPullParser parser = Xml.newPullParser();
//解析文件輸入流
parser.setInput(inStream, "UTF-8");
//產生第一個事件
int eventType = parser.getEventType();
//只要不是文檔結束事件,就一直循環
while(eventType!=XmlPullParser.END_DOCUMENT)
{
switch (eventType)
{
//觸發開始文檔事件
case XmlPullParser.START_DOCUMENT:
students = new ArrayList<Student>();
break;
//觸發開始元素事件
case XmlPullParser.START_TAG:
//獲取解析器當前指向的元素的名稱
String name = parser.getName();
if("student".equals(name))
{
//通過解析器獲取id的元素值,並設置student的id
mStudent = new Student();
mStudent.setId(parser.getAttributeValue(0));
}
if(mStudent!=null)
{
if("name".equals(name))
{
//獲取解析器當前指向元素的下一個文本節點的值
mStudent.setName(parser.nextText());
}
if("age".equals(name))
{
//獲取解析器當前指向元素的下一個文本節點的值
mStudent.setAge(new Short(parser.nextText()));
}
if("sex".equals(name))
{
//獲取解析器當前指向元素的下一個文本節點的值
mStudent.setSex(parser.nextText());
}
}
break;
//觸發結束元素事件
case XmlPullParser.END_TAG:
//
if("student".equals(parser.getName()))
{
students.add(mStudent);
mStudent = null;
}
break;
default:
break;
}
eventType = parser.next();
}
return students;
}
Ⅳ 如何用pull解析器解析androidmanifest.xml文件
PULL解析xml:
1、核心類:
XmlPullParserFactory
XmlPullParser
2、核心代碼:
// 實例化一個xml pull解析的工廠
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
// 實例化一個xml pull解析對象
XmlPullParser pullParser = factory.newPullParser();
// 將xml文件作為流傳入到inputstream
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream("customers.xml"));
// xml解析對象接收輸入流對象
pullParser.setInput(bis, "utf-8");
int event = pullParser.getEventType();
List<Map<String, Object>> list = null;
Map<String, Object> map = null;
while (event != XmlPullParser.END_DOCUMENT) {
switch (event) {
case XmlPullParser.START_DOCUMENT:
list = new ArrayList<>();
break;
case XmlPullParser.START_TAG:
if ("customer".equals(pullParser.getName())) {
map = new HashMap<String, Object>();
}
if (pullParser.getName().equals("name")) {
map.put("name", pullParser.nextText());
}
if (pullParser.getName().equals("tel")) {
map.put("tel", pullParser.nextText());
}
// if (pullParser.getName().equals("email")) {
// map.put("email", pullParser.nextText());
// }
break;
case XmlPullParser.END_TAG:
if (pullParser.getName().equals("customer")) {
list.add(map);
}
break;
}
event = pullParser.next();
}
希望能幫助你!
Ⅳ android中使用哪種方式解析XML比較好
PULL解析器,因為SAX解析器操作起來太笨重,DOM不適合文檔較大,內存較小的場景,唯有PULL輕巧靈活,速度快,佔用內存小,使用非常順手。
在Android中,常見的XML解析器分別為SAX解析器、DOM解析器和PULL解析器,下面一一詳細介紹。
1、SAX解析器:
SAX(Simple
API
for
XML)解析器是一種基於事件的解析器,它的核心是事件處理模式,主要是圍繞著事件源以及事件處理器來工作的。當事件源產生事件後,調用事件處理器相應的處理方法,一個事件就可以得到處理。在事件源調用事件處理器中特定方法的時候,還要傳遞給事件處理器相應事件的狀態信息,這樣事件處理器才能夠根據提供的事件信息來決定自己的行為。
SAX解析器的優點是解析速度快,佔用內存少。非常適合在Android移動設備中使用。
2、DOM解析器:
DOM是基於樹形結構的的節點或信息片段的集合,允許開發人員使用DOM
API遍歷XML樹、檢索所需數據。分析該結構通常需要載入整個文檔和構造樹形結構,然後才可以檢索和更新節點信息。
由於DOM在內存中以樹形結構存放,因此檢索和更新效率會更高。但是對於特別大的文檔,解析和載入整個文檔將會很耗資源。
3、PULL解析器:
PULL解析器的運行方式和SAX類似,都是基於事件的模式。不同的是,在PULL解析過程中,我們需要自己獲取產生的事件然後做相應的操作,而不像SAX那樣由處理器觸發一種事件的方法,執行我們的代碼。PULL解析器小巧輕便,解析速度快,簡單易用,非常適合在Android移動設備中使用,Android系統內部在解析各種XML時也是用PULL解析器。
Ⅵ 安卓用Pull解析xml,連接伺服器讀取xml為啥log.d沒有輸出
步驟:
1.連接伺服器獲取xml文件;
2.使用pull解析xml文件存入實體對象中;
3.解析後將實體對象存入List集合中;
4.使用BaseAdapter,將List集合中中的數據顯示在listview中;
注意許可權的添加;
xml布局文件:
item_listview.xml
[html] view plain print?
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.loopj.android.image.SmartImageView
android:id="@+id/image"
android:layout_width="90dp"
android:layout_height="70dp"
android:layout_alignBottom="@+id/tv_comment"
android:layout_alignParentLeft="true"
android:layout_margin="5dp"
android:layout_alignParentTop="true"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/image"
android:singleLine="true"
android:text="新聞標題"
android:textSize="22sp" />
<TextView
android:id="@+id/tv_detail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/tv_title"
android:layout_toRightOf="@id/image"
android:lines="2"
android:text="新聞內容新聞內容新聞內容新聞內容新聞內容"
android:textSize="15sp" />
<TextView
android:id="@+id/tv_comment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@id/tv_detail"
android:text="13833條評論"
android:textColor="#ff0000" />
</RelativeLayout>
Ⅶ android 中有哪幾種解析xml的類官方推薦哪種
xml解析主要有dom, sax, pull, kxml這幾種主流的解析方式。android官方推薦的是pull解析
Ⅷ android中xml解析pull與sax有什麼區別
xml解析一共有幾種方式:
一個是DOM,它是生成一個樹,有了樹以後搜索、查找都可以做。
另一種是基於流的,就是解析器從頭到尾解析一遍xml文件。
基於流的目前有兩種比較有名,一個是SAX,另一個是PULL
sax的原理是解析器解析過程中通過回調把tag/value值等傳遞可以比較、操作。而pull的原理是它只告訴一個tag開始或者結束了,至於tag/value的值是什麼需要自己去向parser問,所以叫做pull,而sax看起來是push給的。sax/pull還有一點區別,隨便找個sax和pull的例子比較一下就可以發現,pull是一個while循環,隨時可以跳出,而sax不是,sax是只要解析了,就必須解析完成。
Ⅸ android中xml解析pull與sax有什麼區別
android中xml解析pull與sax,可以通過以下介紹了解區別:
1、SAX是一個解析速度快並且佔用內存少的xml解析器,非常適合用於android等移動設備,SAX全稱是Simple API for Xml,既是指一種介面,也是一個軟體包,作為介面,sax是事件驅動型xml解析的一個標准介面。具有如下特點1. 解析效率高,佔用內存少。2.可以隨時停止解析。3.不能載入整個文檔到內存。4.不能寫入xml5.SAX解析xml文件採用的是事件驅動。
2、Pull解析XML文件的方式與SAX解析XML文件的方式大致相同,他們都是基於事件驅動的,頁是Android中默認的解析方式,更適用於移動平台的解析方式。所以,利用pull解析XML文件需要下面幾個步驟:1.通過XMLPullParserFactory獲取XMLPullParser對象。2.通過XMLPullParser對象設置輸入流。3.通過parser.next(),持續的解析XML文件直到文件的尾部。
Ⅹ android pull解析xml相同的標簽名
Pull解析和Sax解析很相似,都是輕量級的解析
我以前只用Sax解析
不過原理都是相同的
解析判斷如果是<>尖括弧裡面的用getAttributeValue
(0)
0是第一個位置的元素
相當於你上面的title
如果名字都是一樣的解析的時候很難判斷解析的是哪個name
一般不會有這么麻煩的應用吧