Android之XML解析应用

1      XML解析No29

XML:可拓展标记语言,语言和HTML类似,也是一种标记语言。

特点:标记是自定义的,并区分大小写

除开文档声明的标签,XML文件中只能有一个根标签。

XML的应用场景

l传输数据

XML本质上是一段字符串,具有跨平台性的特性,因此XML常被用来在不同系统之间进行数据交换。

l配置文件

XML可以在保存数据的同时保存数据之间的关系。利用这一特点,它还经常用作应用程序配置文件来使用。

XML解析和序列化

lAndroid中,XML解析主要有三种方式

Ø  DOM解析(org.w3c.dom)

ü  语法简单,但是使用时需要将整个文档加载到内存中,耗内存

ü  特点:在解析的时候会将文本中的数据一次性全部加载到内存中

Ø  SAX解析(org.xml.sax)

ü  语法复杂,不需要一次性将文档加载到内存中,内存消耗小

ü  特点:在解析的时候是一点一点加载内容并解析

ØPull解析(org.xmlpull.v1)

ü  在Android鼓励使用Pull方式来解析xml文件(Android集成了Pull解析)

ü  类似于SAX解析,语法比SAX解析简单,效率更高

lPull解析方式

Ø  Xml.newPullParser // 获取一个Pull解析器对象

Ø  setInput(Reader reader)

Ø  setInput(InputStreaminputStream, String inputEncoding)

Ø  Context.getResources().getXml(intresId)

ü  Android下专用的方法

ü  用于获得一个XmlResourceParser(其实就是XmlPullParser的子类)

ü  返回值对象已经指定了xml文件

ü  私有的xml文件也能像资源一样放入/res/xml下

Ø  getEventType() // 获得当前的事件类型

ü  XmlPullParser.START_DOCUMENT

ü  XmlPullParser.END_DOCUMENT

ü  XmlPullParser.START_TAG

ü  XmlPullParser.END_TAG

ü  XmlPullParser.TEXT

Ø  next() // 访问下一个event,并返回下一个事件的类型

Ø  getAtttributeValue() // 获取属性值

Ø  nextText() // 获得当前标签后对应的值

lXml的序列化

有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中;或者使用DOM API生成XML文件,或者也可以使用pull序列化器生成XML文件,这里推荐大家使用Pull序列化器。

案例中需要用到的xml文件如下:

文件名称:iotek.xml

小强

5

如花

5

1.1    SAX解析

待解析文件:

zhangsan

20

lisi

21

wangwu

22

thinkinginJava

15

SpringAction

39

张明

30

莉莉

25

public class Student{

private String id;

private String name;

private String age;

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 String getAge() {

return age;

}

public void setAge(String age) {

this.age = age;

}

}

public classStudentHandler extends DefaultHandler {

private String currentTag ="";//当前标签

private List list;//声明在属性位置,生命周期长,可在多方法间操作

private Student student;   //声明在属性位置,让各个方法都可以操作它指向的对象

@Override

//开始文档

public void startDocument() throwsSAXException {

list = newArrayList();    //创建list

}

//开始文档节点

@Override

public void startElement(String uri,String localName, String qName,

Attributesattributes) throws SAXException {

currentTag = qName;  //每次遇到开始标签,把这个标签的名字赋给currentTag

if(currentTag.equals("student")){//当前标签为student

String attr =attributes.getValue("id");

student = newStudent();  //扫描student开始标签,就要创建一个Student对象

student.setId(attr);      //将解析出的id值设置进student

}

}

//结束标签

@Override

public void endElement(String uri,String localName, String qName)

throws SAXException{

currentTag  = "";//遇到结束标签,将currentTag改回"",避免后面的文本被误认为是name和age

if(qName.equals("student")){

list.add(student);//把新建并初始化好了的Student对象放进list

}

}

@Override

public void characters(char[] ch, intstart, int length)

throws SAXException{

if(currentTag.equals("name")){//如果当前标签为name

student.setName(newString(ch,start,length));//将最近new的学生对象名字设置成解析出的内容

}elseif(currentTag.equals("age")){//如果当前标签是age

student.setAge(newString(ch, start, length));//将最近new的学生对象年龄设置一下

}

}

@Override

public void endDocument() throwsSAXException {

System.out.println("文档解析结束");

}

//方法返回List

public List getList(){

return list;

}

}

测试:

SAXParserFactoryfactory =SAXParserFactory.newInstance();

StudentHandler handler = newStudentHandler();

try {

SAXParser parser =factory.newSAXParser();

parser.parse(newFileInputStream("g:/student.xml"), handler);

Listlist = handler.getList();//把解析好的,填充了学生对象的list取出来

for (Student s :list) {

System.out.println(s.getId()+""+s.getName()+" "+s.getAge());

}

SAXParserFactoryfactory = SAXParserFactory.newInstance();

try {

SAXParser parser =factory.newSAXParser();

URL url = newURL("http://localhost:8080/forecast/forecast.xml");

HttpURLConnectioncon = (HttpURLConnection) url.openConnection();

if(con.getResponseCode()==200){

TempHandlerhandler = new TempHandler();

parser.parse(con.getInputStream(),handler);

Listlist = handler.getList();

Collections.sort(list,new Comparator(){

publicint compare(City o1, City o2) {

returno1.getTemp()-o2.getTemp();

}

});

for(City c:list){

System.out.println(c);

}

}

Map形式存储:

public class MyHandler extends DefaultHandler {

privateHashMap map = null;//存储单个解析的完整对象

privateList> list = null;//存储所有解析对象

privateString currentTag = null; //正在解析的元素的标签

privateString currentValue = null; //解析当前元素的值

privateString nodeName = null; //解析当前的节点名称

//构造方法

publicMyHandler(String nodeName) {

this.nodeName= nodeName;

}

//属性list get方法

publicList> getList() {

returnlist;

}

@Override

//开始文档

public voidstartDocument() throws SAXException {

//TODO Auto-generated method stub

//当读到第一个开始标签的时候,就会触发这个方法

list= new ArrayList>();

}

@Override

//开始节点

public voidstartElement(String uri, String localName, String qName,

Attributesattributes) throws SAXException {

//当遇到文档开头的时候,调用这个方法

//TODO Auto-generated method stub

if(qName.equals(nodeName)) {

map= new HashMap();

}

if(attributes != null && map != null) {

for(int i = 0; i < attributes.getLength(); i++) {

map.put(attributes.getQName(i),attributes.getValue(i));

}

}

currentTag= qName;

}

@Override

//解析到文本

public voidcharacters(char[] ch, int start, int length)

throwsSAXException {

//TODO Auto-generated method stub

//这个方法是用来处理xml文件所读取到的内容

if(currentTag != null && map != null) {

currentValue= new String(ch, start, length);

if(currentValue != null && !currentValue.trim().equals("")

&&!currentValue.trim().equals("\n")) {

map.put(currentTag,currentValue);

}

}

currentTag= null; //把当前的节点的对应值和标签设置为空

currentValue= null;

}

@Override

public voidendElement(String uri, String localName, String qName)

throwsSAXException {

//TODO Auto-generated method stub

//遇到结束标记的时候,会调用这个方法

if(qName.equals(nodeName)) {

list.add(map);

map= null;

}

super.endElement(uri,localName, qName);

}

}

public class HttpUtils {

publicHttpUtils() {

}

publicstatic InputStream getXML(String path){

InputStreaminputStream=null;

try{

URLurl=new URL(path);

if(url!=null){

HttpURLConnectionconnection=(HttpURLConnection)url

.openConnection();

connection.setConnectTimeout(3000);

connection.setDoInput(true);

connection.setRequestMethod("GET");

intcode=connection.getResponseCode();

if(code==200){

inputStream=connection.getInputStream();

}

}

}catch (Exception e) {

//TODO: handle exception

}

returninputStream;

}

}

public class SaxService {

publicSaxService() {

//TODO Auto-generated constructor stub

}

publicstatic List> readXML(

InputStreaminputStream, String nodeName) {

/*              List> list = null;*/

try{

//创建一个解析xml的工厂对象

SAXParserFactoryapf = SAXParserFactory.newInstance();

SAXParserparser = apf.newSAXParser();//解析xml

MyHandlerhandler = new MyHandler(nodeName);

parser.parse(inputStream,handler);

inputStream.close();

returnhandler.getList();

}catch (Exception e) {

//TODO: handle exception

}

returnnull;

}

}

public class Test {

publicTest() {

//TODO Auto-generated constructor stub

}

/**

* @param args

*/

publicstatic void main(String[] args) {

//TODO Auto-generated method stub

//               Stringpath="http://192.168.81.144:8080/myhttp/persons.xml";

Stringpath="http://xys:8080/myhttp/persons.xml";

InputStreaminputStream=HttpUtils.getXML(path);

try{

List>list=SaxService.readXML(inputStream, "person");

for(HashMap map:list){

System.out.println(map.toString());

}

}catch (Exception e) {

//TODO: handle exception

}

}

}

1.2    PULL解析

待解析文件:


zhangsan

20

lisi

21

wangwu

22

解析1:

public class Student {

privateString id;

privateString name;

privateString age;

publicString getId() {

returnid;

}

public voidsetId(String id) {

this.id= id;

}

publicString getName() {

returnname;

}

public voidsetName(String name) {

this.name= name;

}

publicString getAge() {

returnage;

}

public voidsetAge(String age) {

this.age= age;

}

@Override

publicString toString() {

return"Student [id=" + id + ", name=" + name + ", age="+ age + "]";

}

}

publicstatic void main(String[] args) {

try{//创建解析工厂

XmlPullParserFactoryfactory = XmlPullParserFactory.newInstance();

//工厂制造解析器

XmlPullParserparser = factory.newPullParser();

//设置输入,设置要解析的东西

parser.setInput(newFileReader("g:/human.xml"));

//next方法返回下一个要解析的内容的类型,如:标签开始、标签结束、标签之间的文本

inttype = parser.next();//扫描下一个内容,返回下一个内容的类型,int类型的,赋给type

StringcurrentTag = "";//当前标签

while(type!=XmlPullParser.END_DOCUMENT){//通过type是否等于1来判断是否到达底部

if(type== XmlPullParser.START_TAG){//如果扫描的是开始标签

System.out.println("<"+parser.getName()+">");

currentTag= parser.getName();//currentTag赋为标签名

if(currentTag.equalsIgnoreCase("human")){//如果标签为Human

System.out.println(parser.getAttributeValue(null,"id"));//打印属性id值

}

}elseif(type== XmlPullParser.END_TAG){//如果扫描到的是结束标签

System.out.println("<"+parser.getName()+">");

currentTag="";//currentTag赋为空

}elseif(type == XmlPullParser.TEXT){//如果扫描到的是标签间的文本

System.out.println(parser.getText());//打印出标签间文本

if(currentTag.equals("human")){//如果这个文本在human的开始、结束标签之间

System.out.println(parser.getText().trim());//打印这个文本

}

}

type= parser.next();//每次操作完成后,再往后扫描

}

public static void main(String[] args) {

try{//创建解析工厂

XmlPullParserFactoryfactory = XmlPullParserFactory.newInstance();

//工厂制造解析器

XmlPullParserparser = factory.newPullParser();

//设置输入,设置要解析的东西

parser.setInput(newFileReader("g:/student.xml"));

//next方法返回下一个要解析的内容类型,如:标签开始、标签结束、标签之间的文本

inttype = parser.next();//扫描下一个内容,返回下一个内容的类型,int类型的,赋给type

StringcurrentTag = "";//当前标签

Listlist = new ArrayList();//空list

Students = null;//声明在循环外面,为了在多次循环中对同一个Student对象进行操作

while(type!= XmlPullParser.END_DOCUMENT){//通过type是否等于1来判断是否到达底部

if(type== XmlPullParser.START_TAG){//如果扫描的是开始标签

currentTag= parser.getName();//currentTag赋为标签名

if(currentTag.equals("student")){//如果是开始标签为student

s= new Student();//创建一个学生对象

s.setId(parser.getAttributeValue(null,"id"));//把id属性的值放进学生对象

}

}elseif(type == XmlPullParser.END_TAG){//如果扫描到的是结束标签

currentTag= "";//currentTag赋为空

if(parser.getName().equals("student")){//如果是student结束标签

list.add(s);//把这个学生放进list

}

}elseif(type==XmlPullParser.TEXT){//如果扫描到的是标签间的文本

if(currentTag.equals("name")){

s.setName(parser.getText().trim());//将内容设置进学生对象

}elseif(currentTag.equals("age")){//如果在age的开始、结束标签之间

s.setAge(parser.getText());    //设置进学生对象

}

}

type= parser.next();//每次操作完成后,再往后扫描

}

for(Student stu : list) {

System.out.println(stu);

}

public staticvoid main(String[] args) {

try{//创建解析器工厂

XmlPullParserFactoryfactory = XmlPullParserFactory.newInstance();

//工厂制造解析器

XmlPullParserparser = factory.newPullParser();

//设置输入,设置需要解析的东西

parser.setInput(newFileReader("g:/student.xml"));

inttype = 0;

StringcurrentTag = "";//当前标签

Listlist = new ArrayList();//空list

Students =null;//声明在循环外面,为了在多次循环中对同一个Student对象进行操作

while((type=parser.next())!=XmlPullParser.END_DOCUMENT){//通过type是否等于1来判断是否到达底部

//                                 type= parser.next();//一次循环只能调用一次next()

if(type== XmlPullParser.START_TAG){//如果扫描的是开始标签

currentTag= parser.getName();//currentTag赋为标签名

if(currentTag.equals("student")){//如果是开始标签为student

s= new Student();   //创建一个学生对象

s.setId(parser.getAttributeValue(null,"id"));//把id属性的值放进学生对象

}

}elseif(type == XmlPullParser.END_TAG){//如果扫描到的是结束标签

currentTag= "";//currentTag赋为空

if(parser.getName().equals("student")){

list.add(s);//把这个学生放进list

}

}elseif(type == XmlPullParser.TEXT){//如果扫描到的是标签间的文本

if(currentTag.equals("name")){//如果这个文本在name的开始、结束标签之间

s.setName(parser.getText().trim());//将内容放置进学生对象

}elseif(currentTag.equals("age")){//如果在age的开始、结束标签之间

s.setAge(parser.getText().trim());//设置进学生对象

}

}

}

for(Student stu : list) {

System.out.println(stu.toString());

}

System.out.println(list.size());

解析2:

public class Person {

private intid;

privateString name;

private intage;

publicPerson() {

//TODO Auto-generated constructor stub

}

public intgetId() {

returnid;

}

public voidsetId(int id) {

this.id= id;

}

publicString getName() {

returnname;

}

public voidsetName(String name) {

this.name= name;

}

public intgetAge() {

returnage;

}

public voidsetAge(int age) {

this.age= age;

}

publicPerson(int id, String name, int age) {

this.id= id;

this.name= name;

this.age= age;

}

@Override

publicString toString() {

return"Person [id=" + id + ", name=" + name + ", age="+ age + "]";

}

}

public class HttpUtils {

publicHttpUtils() {

//TODO Auto-generated constructor stub

}

/**

*从服务器获得xml文件返回流

*

* @param path

* @return

*/

publicstatic InputStream getXML(String path) {

InputStreaminputStream = null;

try{

URLurl = new URL(path);

if(url != null) {

HttpURLConnectionconnection = (HttpURLConnection) url

.openConnection();

connection.setConnectTimeout(3000);

connection.setDoInput(true);

connection.setRequestMethod("GET");

intcode = connection.getResponseCode();

if(code == 200) {

inputStream= connection.getInputStream();

}

}

}catch (Exception e) {

//TODO: handle exception

}

returninputStream;

}

}

public class PullXMLTools {

/**

*主要是使用PULL解析xml

*/

publicPullXMLTools() {

//TODO Auto-generated constructor stub

}

/**

*

* @param inputStream

*从服务器获取xml文件,以流的形式返回

* @param encode

*编码格式

* @return

* @throws XmlPullParserException

*/

publicstatic List parseXML(InputStream inputStream, String encode)

throwsException {

Listlist = null;

Personperson = null; //装载解析每一个person节点的内容

//创建一个xml解析的工厂

XmlPullParserFactoryfactory = XmlPullParserFactory.newInstance();

//获得xml解析类的引用

XmlPullParserparser = factory.newPullParser();

parser.setInput(inputStream,encode);

//获得事件的类型

inteventType = parser.getEventType();

while(eventType != XmlPullParser.END_DOCUMENT) {

switch(eventType) {

caseXmlPullParser.START_DOCUMENT:

list= new ArrayList();

break;

caseXmlPullParser.START_TAG:

if("person".equals(parser.getName())) {

person= new Person();

//取出属性值

intid = Integer.parseInt(parser.getAttributeValue(0));

person.setId(id);

}else if ("name".equals(parser.getName())) {

Stringname = parser.nextText();//获取该节点的内容

person.setName(name);

}else if ("age".equals(parser.getName())) {

intage = Integer.parseInt(parser.nextText());

person.setAge(age);

}

break;

caseXmlPullParser.END_TAG:

if("person".equals(parser.getName())) {

list.add(person);

person= null;

}

break;

}

eventType= parser.next();

}

returnlist;

}

}

/**

* @param args

*/

publicstatic void main(String[] args) {

//TODO Auto-generated method stub

Stringpath="http://xys:8080/myhttp/persons.xml";

InputStreaminputStream=HttpUtils.getXML(path);

Listlist=null;

try{

list=PullXMLTools.parseXML(inputStream,"utf-8");

for(Personperson:list){

System.out.println(person);

}

}catch (Exception e) {

//TODO: handle exception

}

}

XML extensible markup language 可扩展标记语言,使用标签来表达信息,标签的使用方式和html是一样的,但是比html更灵活,使用范围更广泛,可以认为html是一种特殊的xml;一般用于网络信息传输、信息的保存(如web.xml)

SAX它是在JDK中集成了的xml处理工具,可以用来生成、解析xml

SAXParserFactory解析工厂

SAXParser解析器

parse(InputStreamis,DefaultHandler dh)

第一个参数是要解析什么,第二个是怎么解析

DefaultHandler   默认处理逻辑

要先定义一个类继承DefaultHandler,重写其中的关键方法,写上解析的逻辑,再将其实例化,作为第二个参数传给parse方法

关键方法:

startElement()在扫描到开始标签时回调

参数qName代表标签名

参数attributes代码属性,可以用getValue()取出某属性

endElement()在扫描到结束标签时回调

参数qName代表标签名

characters()扫描到标签之间文本时回调,要注意在任何两个标签之间都会回调这个方法;可以通过定义属性并在

可用三个参数生成new String(ch,start,length)

startElement()和endElement()中变更并在characters()中判断的方式过滤掉无效的文本

startDocument()在开始扫描文档时回调

endDocument()在结束扫描文档时回调

PULL 解析,Android自带,但JDK没有

1.2.1  课堂练习

XML文件:books.xml

哈利波特

99.9

Thinking In Java

120

小李飞刀

50

实体类:Book.java

publicclass Book {

private int id;

private String name;

private double price;

public Book(){

}

public Book(int id, String name, doubleprice) {

this.id = id;

this.name = name;

this.price = price;

}

。。。。。。。。。。。。。

解析:XMLDemo.java

publicclass XMLDemo {

public static void main(String[] args)throws XmlPullParserException, IOException {

// XML PULL解析案例

// pull解析器工厂

XmlPullParserFactory factory= XmlPullParserFactory.newInstance();

// 创建pull解析器对象

XmlPullParser parser =factory.newPullParser();

/*

* pull解析的解析方式是类似SAX解析,将解析xml的内容分成不同的事件

* 主要有以下事件:

* 1、XmlPullParser.START_DOCUMENT     文档的开始

* 2、XmlPullParser.END_DOCUMENT                   文档的结尾

* 3、XmlPullParser.START_TAG           开始标签

* 4、XmlPullParser.END_TAG                         结束标签

* 5、XmlPullParser.TEXT                                  文本的内容

*/

// 指定解析的文件

FileReader fr = newFileReader("src\\bo\\books.xml");

parser.setInput(fr);

// 声明List集合的引用

List list = null;

// 声明Book引用,用于临时保存Book对象的引用

Book book = null;

// 获取事件的类型

int eventType =parser.getEventType();

while(eventType !=XmlPullParser.END_DOCUMENT) {

// 对当前的事件进行解析

// 获取到当前标签的标签名

String tagName =parser.getName();

switch (eventType) {

caseXmlPullParser.START_TAG: // 开始标签

if("books".equals(tagName)){

//创建List集合对象,用于保存后面解析出来的Book对象

list= new ArrayList();

} elseif("book".equals(tagName)) {

//创建Book对象,用于保存后面解析出来的Book的属性

book= new Book();

//获取标签中的属性值(根据标签的索引获取,索引从0开始计数)

intid = Integer.parseInt(parser.getAttributeValue(0));

book.setId(id);

} elseif("name".equals(tagName)) {

//获取当前事件的后面的文本内容

Stringname = parser.nextText();

book.setName(name);

} elseif("price".equals(tagName)) {

doubleprice = Double.parseDouble(parser.nextText());

book.setPrice(price);

}

break;

caseXmlPullParser.END_TAG: // 结束标签

if("book".equals(tagName)){

//将Book对象存到list集合中

list.add(book);

//为了便于后期的维护,在使用完引用之后要引用置空,以便于保存下一个对象

book= null;

}

break;

default:

break;

}

// 移动到下一个事件

// 通过next方法可以移动到下一个事件,并获取到下一个事件的类型

eventType =parser.next();

}

fr.close();

fr = null;

for (Book b : list) {

System.out.println(b);

}

}

}

1.2.2  天气解析实例代码

实体类:

/**

* 天气实体类

*/

publicclass Weather {

private String week;

private String temperature;

public String getWeek() {

return week;

}

public void setWeek(String week) {

this.week = week;

}

public String getTemperature() {

return temperature;

}

public void setTemperature(Stringtemperature) {

this.temperature =temperature;

}

@Override

public String toString() {

return "Weather[week=" + week + ", temperature=" + temperature + "]";

}

}

网络封装工具类:

publicclass HttpUtils {

private static final int TIMEOUT =10000;

//返回一个字节数组

public static byte[] doGet(Stringpath){

try {

URL mUrl = newURL(path);

HttpURLConnectionconn = (HttpURLConnection)mUrl.openConnection();

conn.setRequestMethod("GET");

conn.setReadTimeout(TIMEOUT);

conn.setReadTimeout(TIMEOUT);

conn.connect();

int code =conn.getResponseCode();

if(code == 200){

return readStream(conn.getInputStream());

}else{

throw new RuntimeException("网络访问失败:"+code);

}

} catch(MalformedURLException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

return null;

}

public static byte[] doPost(String url,String params) {

HttpURLConnection conn =null;

try {

URL mUrl = newURL(url);

conn =(HttpURLConnection) mUrl.openConnection();

conn.setRequestMethod("POST");

conn.setConnectTimeout(TIMEOUT);

conn.setReadTimeout(TIMEOUT);

// 设置请求属性

conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");

conn.setRequestProperty("Content-Length",params.length()+"");

// Post请求必须要写以下两行代码

conn.setDoInput(true);

conn.setDoOutput(true);

// 将请求参数写到请求体中

conn.getOutputStream().write(params.getBytes());;

conn.connect();

int code =conn.getResponseCode();

if(code == 200) {

returnreadStream(conn.getInputStream());

} else {

throw newRuntimeException("网络访问失败:"+ code);

}

} catch (Exception e) {

e.printStackTrace();

return null;

} finally {

if(conn != null) {

conn.disconnect();

conn =null;

}

}

}

//返回一个字符串

public static String doGetStr(Stringpath) throws IOException{

byte[] data = doGet(path);

return new String(data, "utf-8");

}

private static byte[]readStream(InputStream is) throws IOException{

ByteArrayOutputStream baos =new ByteArrayOutputStream();

byte[] buf = new byte[1024];

int len =0;

while((len =is.read(buf))!=-1){

baos.write(buf, 0,len);

}

return baos.toByteArray();

}

}

解析代码:

publicclass Test {

public static void main(String[] args)throws Exception {

// 下载数据

String url ="http://api.k780.com:88/?app=weather.future&weaid=1&&appkey=15250&sign=f88a5cecc3cbd37129bc090c0ae29943&format=xml";

String data = new String(HttpUtils.doGet(url),"utf-8");

System.out.println(data);

// 解析数据

XmlPullParserFactory factory= XmlPullParserFactory.newInstance();

XmlPullParser parser =factory.newPullParser();

StringReader sr = newStringReader(data);

parser.setInput(sr);

List list =null;

Weather weather = null;

int eventType =parser.getEventType();

tag:while(eventType !=XmlPullParser.END_DOCUMENT) {

String tagName =parser.getName();

//System.out.println(tagName);

switch (eventType) {

caseXmlPullParser.START_TAG: // 开始标签

if("success".equals(tagName)){

Stringsuccess = parser.nextText();

//如果success不是1的话,说明数据获取失败,直接结束解析

if(!"1".equals(success)){

System.out.println("数据获取失败");

breaktag;

}

} elseif("result".equals(tagName)) {

list= new ArrayList();

} elseif(tagName.startsWith("item")) {

weather= new Weather();

} elseif("week".equals(tagName)) {

Stringweek = parser.nextText();

weather.setWeek(week);

}else if("temperature".equals(tagName)) {

Stringtemperature = parser.nextText();

weather.setTemperature(temperature);

}

break;

caseXmlPullParser.END_TAG: // 结束标签

if(tagName.startsWith("item")){

list.add(weather);

weather= null;

}

break;

default:

break;

}

eventType =parser.next();

}

for (Weather w : list) {

System.out.println(w);

}

}

}

网络请求简约封装:

public static InputStream getXML(Stringpath) {

InputStream inputStream =null;

try {

URL url = newURL(path);

if (url != null) {

HttpURLConnectionconnection = (HttpURLConnection) url

.openConnection();

connection.setConnectTimeout(3000);

connection.setDoInput(true);

connection.setRequestMethod("GET");

intcode = connection.getResponseCode();

if (code ==200) {

inputStream= connection.getInputStream();

}

}

} catch (Exception e) {

// TODO: handleexception

}

return inputStream;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 155,958评论 4 358
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,179评论 1 286
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 105,792评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,409评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,723评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,174评论 1 204
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,543评论 2 306
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,270评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,899评论 1 236
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,235评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,771评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,139评论 2 249
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,688评论 3 228
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,936评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,646评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,194评论 2 265
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,145评论 2 258

推荐阅读更多精彩内容