当前位置:首页 » 安卓系统 » androidxml解析pull

androidxml解析pull

发布时间: 2022-08-21 02:54:54

Ⅰ android里面怎么解析xml

Android解析xml文件总共有三种方法,分别是:

  1. 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;
    }
    }
  2. DOM解析XML文件: DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据。使用DOM操作XML的代码看起来比较直观,并且,在某些方面比基于SAX的实现更加简单。但是,因为DOM需要将XML文件的所有内容读取到内存中,所以内存的消耗比较大,特别对于运行Android的移动设备来说,因为设备的资源比较宝贵,所以建议还是采用SAX来解析XML文件,当然,如果XML文件的内容比较小采用DOM是可行的。

  3. 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
一般不会有这么麻烦的应用吧

热点内容
数据库设计主要内容 发布:2025-01-16 05:02:02 浏览:12
存储过程如何修改 发布:2025-01-16 05:01:55 浏览:633
照片压缩包 发布:2025-01-16 04:56:56 浏览:742
手机存储用到多少最好 发布:2025-01-16 04:56:19 浏览:781
ftp站点不能启动 发布:2025-01-16 04:55:31 浏览:54
pythonip合法性 发布:2025-01-16 04:48:52 浏览:75
锂电池用3a的充电器是什么配置 发布:2025-01-16 04:26:43 浏览:35
好配置为什么感觉打联盟不流畅 发布:2025-01-16 04:23:02 浏览:900
我的世界java编辑服务器信息 发布:2025-01-16 04:21:42 浏览:507
android拨号上网 发布:2025-01-16 04:13:25 浏览:97