xmlpullparser解析xml 可以解析流吗

XmlPullParser解析xml文件 -
- ITeye技术网站
博客分类:
XML解析三种方式
通用性强,它会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据;
简单直观,但需要将文档读取到内存,并不太适合移动设备;
SAX是一个解析速度快并且占用内存少的xml解析器;
采用事件驱动,它并不需要解析整个文档;
实现:继承DefaultHandler,覆写startElement、endElement、characters等方法;
Android自带的XML解析器,和SAX基本类似,也是事件驱动,不同的是PULL事件返回的是数值型;推荐使用。
PULL解析XML核心代码
XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
parser.setInput(fileInputStream, “utf-8”);
int eventCode = parser.getEventType();
while(eventCode != XmlPullParser.END_DOCUMENT)
switch (eventCode){
case XmlPullParser.START_DOCUMENT:
case XmlPullParser.START_TAG:
if("person".equals(parser.getName())) {
case XmlPullParser.END_TAG:
parser.next();
PULL解析XML示例方法
public static List&Person& readXML(InputStream inStream) {
XmlPullParser parser = Xml.newPullParser();
parser.setInput(inStream, "UTF-8");
int eventType = parser.getEventType();
Person currentPerson = null;
List&Person& persons = null;
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
persons = new ArrayList&Person&();
case XmlPullParser.START_TAG:
String name = parser.getName();
if (name.equalsIgnoreCase("person")) {
currentPerson = new Person();
currentPerson.setId(new Integer(parser.getAttributeValue(null, "id")));
} else if (currentPerson != null) {
if (name.equalsIgnoreCase("name")) {
currentPerson.setName(parser.nextText());
} else if (name.equalsIgnoreCase("age")) {
currentPerson.setAge(new Short(parser.nextText()));
case XmlPullParser.END_TAG:
if (parser.getName().equalsIgnoreCase("person")&& currentPerson != null) {
persons.add(currentPerson);
currentPerson = null;
eventType = parser.next();
inStream.close();
} catch (Exception e) {
e.printStackTrace();
return null;
version="1.0" encoding="UTF-8"
Activity文件
package com.app.
import java.io.BufferedW
import java.io.F
import java.io.FileInputS
import java.io.FileNotFoundE
import java.io.FileOutputS
import java.io.InputS
import java.io.OutputStreamW
import java.net.HttpURLC
import java.net.URL;
import java.util.ArrayL
import java.util.HashM
import java.util.L
import org.xmlpull.v1.XmlPullP
import org.xmlpull.v1.XmlPullParserE
import org.xmlpull.v1.XmlPullParserF
import com.app.other.P
import android.app.A
import android.os.B
import android.util.X
import android.widget.TextV
public class XMLActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_xml);
StringBuilder sBuilder = new StringBuilder();
File xmlFile = new File("/mnt/sdcard/App/person.xml");
FileInputStream inputStream = new FileInputStream(xmlFile);
List&Person& list = readXML(inputStream);
for (int i = 0; i & list.size(); i++) {
Person person = list.get(i);
sBuilder.append("第-" + i + "-条记录:\n");
sBuilder.append("getName--" + person.getName() + "\n");
sBuilder.append("getAge--" + person.getAge() + "\n");
sBuilder.append("getId--" + person.getId() + "\n");
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
TextView textView = (TextView)findViewById(R.id.textView2);
textView.setText(sBuilder);
public static List&Person& readXML(InputStream inStream) {
XmlPullParser parser = Xml.newPullParser();
parser.setInput(inStream, "UTF-8");
int eventType = parser.getEventType();
Person currentPerson = null;
List&Person& persons = null;
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
persons = new ArrayList&Person&();
case XmlPullParser.START_TAG:
String name = parser.getName();
if (name.equalsIgnoreCase("person")) {
currentPerson = new Person();
currentPerson.setId(new Integer(parser.getAttributeValue(null, "id")));
} else if (currentPerson != null) {
if (name.equalsIgnoreCase("name")) {
currentPerson.setName(parser.nextText());
} else if (name.equalsIgnoreCase("age")) {
currentPerson.setAge(new Short(parser.nextText()));
case XmlPullParser.END_TAG:
if (parser.getName().equalsIgnoreCase("person")&& currentPerson != null) {
persons.add(currentPerson);
currentPerson = null;
eventType = parser.next();
inStream.close();
} catch (Exception e) {
e.printStackTrace();
return null;
XML布局文件
version="1.0" encoding="utf-8"
xmlns:android="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="15dp"
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="XML文件读取"
android:layout_gravity="center_horizontal"
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
XML文件位置
执行结果:
浏览 14528
浏览: 313064 次
为什么我在主线程中定义也会出现这个bug?
Apache2.4.x版wampserver本地php服务器如 ...
我就用的是这种方法,但是还是最后一行显示不全!着急啊!!1 public class PullTool {
//写一个解析XML文件的方法
* 返回值:List&Student&
* 参数:InputStream is
* 注意 工具类中的方法写成静态
* @throws XmlPullParserException
<span style="color: #
public static List&Student& parserXml(InputStream is) throws Exception{
<span style="color: #
//A.初始化集合以及Student对象
<span style="color: #
List&Student& list = null;
<span style="color: #
Student stu = null;
<span style="color: #
//B.创建生产XML的pull解析器的工厂
<span style="color: #
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
<span style="color: #
//C.使用工厂获取pull解析器
<span style="color: #
XmlPullParser parser = factory.newPullParser();
<span style="color: #
//D.使用解析器读取当前的xml流
<span style="color: #
parser.setInput(is, "UTF-8");
//传入InputStream对象 并且设置解码规则需和XML文档中设置的一致
<span style="color: #
//E.获取当前事件的状态
<span style="color: #
int type = parser.getEventType();
<span style="color: #
<span style="color: #
* 我们知道pull解析是以事件为单位解析的因此我们要获取一开始的解析标记type,之后通过type判断循环来读取文档
<span style="color: #
* 注意:当解析器开始读取is的时候已经开始了,指针type在xml的第一行开始。pull解析是指针从第一行开始读取到最后一行以事件为单位读取的解析方式
<span style="color: #
<span style="color: #
//F.通过while循环判断是否读取到了文档结束
<span style="color: #
while(type != parser.END_DOCUMENT){
<span style="color: #
<span style="color: #
switch (type) {
<span style="color: #
case XmlPullParser.START_TAG:
<span style="color: #
//判断当前遇到的元素名称是否为students
<span style="color: #
if("students".equals(parser.getName())){
<span style="color: #
list = new ArrayList&Student&();
<span style="color: #
}else if("student".equals(parser.getName())){
<span style="color: #
//初始化Student对象
<span style="color: #
stu = new Student();
<span style="color: #
//读取number属性
<span style="color: #
String number = parser.getAttributeValue(null,"number");
<span style="color: #
//String number = parser.getAttributeValue(0);
也可以通过索引获取 这边只有一个属性number
<span style="color: #
//xml解析获得标签属性值:parser.getAttributeValue(null,"cityname")//null:固定值;cityname:属性的名字
<span style="color: #
<span style="color: #
stu.setNumber(number);
//将数据封装到学生类中
<span style="color: #
}else if("name".equals(parser.getName())){
<span style="color: #
String name =
parser.nextText();
//xml解析获得文本属性parser.nextText();
注意:这边if条件中获取的是name标签开始的位置 因此用nextText()方法获取标签体内容
<span style="color: #
stu.setName(name);
<span style="color: #
}else if("sex".equals(parser.getName())){
<span style="color: #
String sex =
parser.nextText();
<span style="color: #
stu.setSex(sex);
<span style="color: #
}else if("age".equals(parser.getName())){
<span style="color: #
Integer.parseInt(parser.nextText());
<span style="color: #
stu.setAge(age);
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
case XmlPullParser.END_TAG:
<span style="color: #
if("student".equals(parser.getName())){
<span style="color: #
list.add(stu);
<span style="color: #
stu = null;
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
//让解析器向下解析一行,并返回改行的事件常量
这样配合while(type != parser.END_DOCUMENT)读取完整个文档
<span style="color: #
type = parser.next();
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
public static void main(String[] args) throws Exception {
<span style="color: #
FileInputStream is = new FileInputStream("src/stu.xml");
<span style="color: #
<span style="color: #
List&Student& list = PullTool.parserXml(is);
<span style="color: #
<span style="color: #
System.out.println(list);
<span style="color: #
<span style="color: #
is.close();
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: # }
Pull解析 与Sax一样.都属于事件驱动的解析方式. 相比Sax解析过程更加灵活. sax一旦开始解析就是从头读到尾.不解析完整个文档不会停 pull解析较为灵活.是以事件为单位.手动向下继续. 如果获得到我们要找的内容. 可以停止继续解析.
对象的种类
Document        &整个xml文档对象
Element         &文档中的标签对象
Atritube         &标签中的属性对象
Text & & & & & & & & & & & & & & &标签体的内容的对象
Common         注释对象
START_DOCUMENT    文档开始
END_DOCUMENT     &文档结束 
START_TAG &&      元素开始
END_TAG         元素结束
1.xml解析获得标签属性值:
String number = parser.getAttributeValue(0);   //通过索引获取 这边只有一个属性number String number =parser.getAttributeValue(null,"cityname");  //null:固定值;cityname:属性的名字
2.获得开始标签之后的标签体内容
&if("name".equals(parser.getName())){ & & //解析到了name开始标签就获取值
String name =
parser.nextText(); & & & & & //xml解析获得文本属性parser.nextText();
注意:这边if条件中获取的是name标签开始的位置 因此用nextText()方法获取标签体内容
stu.setName(name);
阅读(...) 评论()一.什么是1、概念:extensive markup language(可扩展的标记语言)  2、  对3、   DOM(document object model &:文档对象模型):借助文档树模型对  SAX(simple API for   PULL:利用事件流模型来解析  备注:DOM和SAX解析的优劣分析:DOM是将文档一次性读入到内存,然后以文档树模进行分析节点信息。获取到希望获取的数据;而SAX是事件流的形式去分析4、  每一个  二、DOM解析1、核心类:DocumentBuilderFactoryDocumentBuilderDoucmentElementNodeListNode&2、核心代码:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 使用工厂来实例化一个构造Document的对象
DocumentBuilder builder = factory.newDocumentBuilder(); // 利用DocumentBuilder来构造一个Document对象
Document document = builder.parse(filename); // 获取Document文档的根节点对象
Element root = document.getDocumentElement(); // 通过根节点,获取到根节点下面的所有二级子节点
NodeList nodeList = root.getChildNodes();
// 遍历子节点,获取内部的每一个节点
for (int i = 0; i & nodeList.getLength(); i++) {
Node node = nodeList.item(i);
// 获取每个末端阶段的文本值和节点名称,将其存入到Map对象中
map.put(item.getNodeName(), item.getTextContent());
list.add(map);
}&三、PULL解析1、核心类:2、核心代码: 1 // 实例化一个 2
3 // 实例化一个 4
factory.newPullParser(); 5 // 将 6 BufferedInputStream bis = new BufferedInputStream( 7 new FileInputStream("customers.)); 8
9 // 10 pullParser.setInput(bis, "utf-8");11 12 int event = pullParser.getEventType();13 List&Map&String, Object&& list =14 Map&String, Object& map =15 16 while (event != 17 switch (event) {18 case 19 list = new ArrayList&&();2021 case 22 if ("customer".equals(pullParser.getName())) {23 map = new HashMap&String, Object&();24 }25 if (pullParser.getName().equals("name")) {26 map.put("name", pullParser.nextText());27 }28 if (pullParser.getName().equals("tel")) {29 map.put("tel", pullParser.nextText());30 }31 // if (pullParser.getName().equals("email")) {32 // map.put("email", pullParser.nextText());33 // }3435 case 36 if (pullParser.getName().equals("customer")) {37 list.add(map);38 }3940 }41 event = pullParser.next();42 }&3、pull解析方式和dom解析的区别:pull解析中使用了switch case,所以可以获取客户希望获取到的内容,而不用对整个&4、pull parser的使用:(简单易用)只有一个关键方法key(),用于检索下一个事件,只有五个事件类型。四、DOM TREE结构中对节点的分类1、文档节点2、元素节点3、属性节点4、文本节点5、注释节点五、PULL PARSER中的几种event值:1、START_DOCUMENT: 02、END_DOCUMENT: 13、START_TAG: 24、END_TAG: 35、TEXT: 4
、 、 、 、 、如何获取XmlPullParser的输入流,而不消耗掉Xml - 跟谁学
搜索你想学的科目、老师试试,例如“绘画”搜索吉安
&&如何获取XmlPullParser的输入流,而不消耗掉Xml因为实际xml解析操作根据类型有好多,所以想要在解析之前打印parser输入流的内容,同时不影响后续解析。 XmlPullParser parser = Xml.newPullParser(); // 创建一个PULL解析器
in = new ByteArrayInputStream(XmlStr.getBytes("UTF-8"));
parser.setInput(in, "UTF-8");
//上述操作在底层库内,截取不到,我能拿到的是setInput后的parser
//TODO 获取parser的输入流,即in
boolean done =
while (!done) {//xml解析操作
... 一般打日志方案 在解析后打印 String name = xmlPullParser.nextText();
people.setName(name);
Log.d("test01", name);邪蒿xushengxing
是想拿到xmlstr?如果是网络请求返回的xml串,就打印网络返回的串,应该包含xmlstr。
相关问题大家都在看最新提问
关注我们官方微信关于跟谁学服务支持帮助中心Java与XML原来可以这么简单--基于XMLPull的解析器 - 80后Programer---&zhiweiofli - ITeye技术网站
博客分类:
XmlPull和Sax类似,是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序。因为是基于流的处理,因此Xmlpull和Sax都比较节约内存资源,不会象Dom那样要把所有节点以对橡树的形式展现在内存中。
但Xmlpull比Sax更简明,而且不需要扫描完整个流。现在XmlPull是一开源项目,并成为了Google android类库的一部分,想了解更多请查看。XmlPull的jar以及源文件见附件。
XmlPull使用起来很简单,下面献上一自己写的实例,xml数据由google weather api提供:
public class xmlPuller {
public static void main(String[] args) {
XmlPullParser xpp =
String url = "/svn/tags/android.xmlpull.google.weather-1.0/assets/weather.xml";
String filename = "weather.xml";
FileInputStream fis =
InputStream is =
if(getRemoteFile(url,filename)){
fis = new FileInputStream(new File("weather.xml"));
is = new BufferedInputStream(fis);
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
xpp = factory.newPullParser();
xpp.setInput(is,"utf-8");
int type = xpp.getEventType();
StringBuilder sb = new StringBuilder();
while(type!=XmlPullParser.END_DOCUMENT){
switch(type){
case XmlPullParser.START_DOCUMENT:
sb.append("Start document");
case XmlPullParser.START_TAG:
sb.append("Start tag:" + xpp.getName() + "\n");
for(int i=0;i&xpp.getAttributeCount();i++){
sb.append("\t Attr:" + xpp.getAttributeName(i) + "--");
sb.append("Value:" + xpp.getAttributeValue(i));
case XmlPullParser.END_TAG:
sb.append("End tag:" + xpp.getName());
case XmlPullParser.TEXT:
if(xpp.getText().endsWith("")){
sb.append("\t Start text: null");
sb.append("\t Start text:" + xpp.getText());
System.out.println(sb.toString());
sb.delete(0, sb.length());
xpp.next();
type = xpp.getEventType();
System.out.println("End document");
}catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(is!=null){
is.close();
if(fis!=null){
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
运行时经常会遇到以下的异常:
caused by: org.xmlpull.v1.XmlPullParserException: resource not found: /META-INF/services/org.xmlpull.v1.XmlPullParserFactory make sure that parser implementing XmlPull API nested exception is:
org.xmlpull.v1.XmlPullParserException: resource not found: /META-INF/services/org.xmlpull.v1.XmlPullParserFactory make sure that parser implementing XmlPull API is available
at org.xmlpull.v1.XmlPullParserFactory.newInstance(XmlPullParserFactory.java:278)
at org.xmlpull.v1.XmlPullParserFactory.newInstance(XmlPullParserFactory.java:259)
at xmlPuller.main(xmlPuller.java:28)
XmlPullParserException:resource not found!
没有找到这样的资源:META-INF/services/org.xmlpull.v1.XmlPullParserFactory
so,我们就为它添加这样的资源:
将下载的加到你的项目中即可。
就包含了META-INF/services/org.xmlpull.v1.XmlPullParserFactory文件,它的内容其实就是一句话:
org.kxml2.io.KXmlParser,org.kxml2.io.KXmlSerializer
下载次数: 339
下载次数: 369
浏览 12568
zhiweiofli
浏览: 370260 次
来自: 广州
而且fragment调用back也有不需要finish的时候呢 ...
我这里就是拦截的,但是还是报了这个
IT之冕 写道 我的方法是注释掉super.onBackPre ...
上线毛啊,Bad request了
不错 !!!!!!!!!!!!!!}

我要回帖

更多关于 xmlpullparser解析xml 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信