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閱讀 227,401評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,011評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,263評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,323評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,874評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,095評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,605評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,551評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,720評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,961評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,330評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,690評論 2 370

推薦閱讀更多精彩內容