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
】
待解析文件:
【
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
}
}
}
】
待解析文件:
【
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沒有
【
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);
}
}
}
》
】
【
實體類:
/**
* 天氣實體類
*/
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;
}
】