您的位置:首页 > 移动开发 > Android开发

Android之XML解析应用

2016-10-29 21:04 176 查看

1      XML解析No29



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

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

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

XML的应用场景

传输数据

 

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

配置文件

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

XML解析和序列化

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

Ø  DOM解析(org.w3c.dom)

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

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

Ø  SAX解析(org.xml.sax)

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

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

Ø  Pull解析(org.xmlpull.v1)

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

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

Pull解析方式

Ø  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() // 获得当前标签后对应的值

Xml的序列化

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

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

文件名称:iotek.xml

<?xmlversion="1.0" encoding="UTF-8"?>

<persons>

   <person id=“1">

       <name>小强</name>

       <age>5</age>

   </person>

   <person id=“2">

       <name>如花</name>

       <age>5</age>

   </person>

</persons>

 

 



1.1    SAX解析

待解析文件:



<?xml version="1.0"encoding="UTF-8"?>

<class>

         <studentid="1">

                   <name>zhangsan</name>

                   <age>20</age>

         </student>

         <studentid="2">

                   <name>lisi</name>

                   <age>21</age>

         </student>

         <studentid="3">

                   <name>wangwu</name>

                   <age>22</age>

         </student>

</class>

<?xml version="1.0"encoding="UTF-8"?>

<books>

         <bookid="12">

                   <name>thinkingin java</name>

                   <prico>15</prico>

         </book>

         <bookid="15">

                   <name>SpringAction</name>

                   <prico>39</prico>

         </book>

</books>

<?xml version="1.0"encoding="UTF-8"?>

         <persons>

                   <personid="23">

                            <name>张明</name>

                            <age>30</age>

                   </person>

                   <personid="20">

                            <name>莉莉</name>

                            <age>25</age>

                   </person>

         </persons>



 



 

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<Student> list;//声明在属性位置,生命周期长,可在多方法间操作

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

         @Override

        

         //开始文档

         public void startDocument() throwsSAXException {

                   list = newArrayList<Student>();    //创建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<Student> getList(){

                   return list;

         }

}

测试:

SAXParserFactoryfactory =SAXParserFactory.newInstance();

                   StudentHandler handler = newStudentHandler();

                   try {

                            SAXParser parser =factory.newSAXParser();

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

                            List<Student>list = 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);

                                     List<City>list = handler.getList();

                                     Collections.sort(list,new Comparator<City>(){

                                               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<String, String> map = null;//
存储单个解析的完整对象


         privateList<HashMap<String, String>> list = null;//
存储所有解析对象


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


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


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


 

         // 构造方法

         publicMyHandler(String nodeName) {

                   this.nodeName= nodeName;

         }

 

         // 属性list get方法

         publicList<HashMap<String, String>> getList() {

                   returnlist;

         }

 

         @Override

         // 开始文档

         public voidstartDocument() throws SAXException {

                   //TODO Auto-generated method stub

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

                   list= new ArrayList<HashMap<String, String>>();

         }

 

         @Override

         // 开始节点

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

                            Attributesattributes) throws SAXException {

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

                   //TODO Auto-generated method stub

                   if(qName.equals(nodeName)) {

                            map= new HashMap<String, String>();

                   }

                   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<HashMap<String, String>> readXML(

                            InputStreaminputStream, String nodeName) {

/*              List<HashMap<String,String>> 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<HashMap<String,String>>list=SaxService.readXML(inputStream, "person");

                            for(HashMap<String,String> map:list){

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

                            }

                   }catch (Exception e) {

                            //TODO: handle exception

                   }

         }

 

}



1.2    PULL解析

待解析文件:



<?xmlversion="1.0" encoding="UTF-8"?>

<class>

         <student id="1">

                   <name>zhangsan</name>

                   <age>20</age>

         </student>

         <student id="2">

                   <name>lisi</name>

                   <age>21</age>

         </student>

         <student id="3">

                   <name>wangwu</name>

                   <age>22</age>

         </student>

</class>



解析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 = "";//当前标签

                            List<Student>list = new ArrayList<Student>();//空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 = "";//当前标签

                            List<Student>list = new ArrayList<Student>();//空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<Person> parseXML(InputStream inputStream, String encode)

                            throwsException {

                   List<Person>list = 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<Person>();

                                     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);

                   List<Person>list=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



<?xmlversion="1.0" encoding="UTF-8"?>

<books>

         <book id="1">

                   <name>哈利波特</name>

                   <price>99.9</price>

         </book>

         <book id="2">

            <name>Thinking In Java</name>

                   <price>120</price>

         </book>

         <book id="3">

            <name>小李飞刀</name>

                   <price>50</price>

         </book>

</books>



 

实体类: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<Book> 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<Book>();

                                     } 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<Weather> 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<Weather>();

                                     } 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;

         }

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: