解析xml是在java編譯工作中最重要的一步,比如我們訪問某網(wǎng)站,我們就需要獲取它的數(shù)據(jù),我們發(fā)出請求,服務(wù)器
做出響應(yīng)。然后根據(jù)傳過來的數(shù)據(jù)判斷,是XML或是JSON.我們今天了解一下解析XML。
首先配置網(wǎng)絡(luò)環(huán)境。我們模擬一下場景。
1.開啟TomCat,搭建服務(wù)器
2.在root目錄下放入一個寫好XML文件
3.輸入DOS命令---ipconfig,復(fù)制生成一串ip地址,在瀏覽器中測試打印出文件
配置好久開始代碼編寫。解析XML有三種方式。第一種是DOM,不常用,他比較耗資源,需要一次性全部加載
| public void parseXML(View view){ new MyTask().execute(); } //線程間通信機(jī)制 //子線程+Handler //異步任務(wù)類 AsyncTask class MyTask extends AsyncTask{ @Override PRotected Object doInBackground(Object[] objects) { //01.獲取網(wǎng)絡(luò)XML數(shù)據(jù) //原生態(tài)底層: //URLConnection try { URL url=new URL("http://192.168.43.135/persons.xml"); HttpURLConnection connection= (HttpURLConnection) url.openConnection(); //設(shè)置請求方式‘ connection.setRequestMethod("GET"); //設(shè)置請求連接超時的時間(優(yōu)化) connection.setConnectTimeout(5000); //獲取結(jié)果碼 int code=connection.getResponseCode(); if(code==200){ //獲取服務(wù)器返回過來的結(jié)果 InputStream is=connection.getInputStream(); //打?。ㄗx)--》測試// BufferedReader br=new BufferedReader(new InputStreamReader(is));// String str=null;// while((str=br.readLine())!=null){// Log.i("test",str);// } //解析XML //01.使用DOM解析// DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();// DocumentBuilder documentBuilder=documentBuilderFactory.newDocumentBuilder();// Document document=documentBuilder.parse(is);// //獲取跟標(biāo)簽// Element root=document.getDocumentElement();// Log.i("test","跟標(biāo)簽:"+root.getNodeName());//// //獲取<persons>下面的所有的子標(biāo)簽<person>// NodeList nodeList=root.getElementsByTagName("person");// for (int i = 0; i <nodeList.getLength() ; i++) {// //獲取單個// //Node// //Element// Element personElement= (Element) nodeList.item(i);// //獲取<person>屬性id的值// String id=personElement.getAttribute("id");// Log.i("test",id);//// //獲取<person>下面的子標(biāo)簽<name><age><image>的值// Element nameElement= (Element) personElement.getElementsByTagName("name").item(0);// String name=nameElement.getTextContent();// Element ageElement= (Element) personElement.getElementsByTagName("age").item(0);// String age=ageElement.getTextContent();// Element imageElement= (Element) personElement.getElementsByTagName("image").item(0);// String image=imageElement.getTextContent();//// Log.i("test",name+" "+age+" "+image);// } |
| //02.SAX(邊讀邊解析,基于事件(方法)驅(qū)動方式)// SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();// SAXParser saxParser=saxParserFactory.newSAXParser();//// saxParser.parse(is,new DefaultHandler(){// @Override// public void startDocument() throws SAXException {// super.startDocument();// }//// @Override// public void endDocument() throws SAXException {// super.endDocument();// }//// @Override// public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {// super.startElement(uri, localName, qName, attributes);// cuurentTag=localName;// //獲取開始標(biāo)簽的名字// if("person".equals(localName)){// //取屬性的值// String id=attributes.getValue(0);// Log.i("test",id);// }////// }//// @Override// public void endElement(String uri, String localName, String qName) throws SAXException {// super.endElement(uri, localName, qName);// cuurentTag=null;// }//// @Override// public void characters(char[] ch, int start, int length) throws SAXException {// super.characters(ch, start, length);// if("name".equals(cuurentTag)){// //獲取<name>的值// String name=new String(ch,start,length);// Log.i("test", " "+name);// }else if("age".equals(cuurentTag)){// //獲取<name>的值// String age=new String(ch,start,length);// Log.i("test", " "+age);// }else if("image".equals(cuurentTag)){// //獲取<name>的值// String image=new String(ch,start,length);// Log.i("test", " "+image);// }// }// }); |
第三種PULL。也是安卓開發(fā)中用的最多的一種
| //03.使用PULL解析(類似SAX) XmlPullParser xmlPullParser=Xml.newPullParser(); xmlPullParser.setInput(is,"UTF-8"); //獲取解析的標(biāo)簽的類型 int type=xmlPullParser.getEventType(); while(type!=XmlPullParser.END_DOCUMENT){ switch (type) { case XmlPullParser.START_TAG: //獲取開始標(biāo)簽名字 String starttagName=xmlPullParser.getName(); if("person".equals(starttagName)){ //獲取id的值 String id=xmlPullParser.getAttributeValue(0); Log.i("test",id); }else if("name".equals(starttagName)){ String name=xmlPullParser.nextText(); Log.i("test",name); }else if("age".equals(starttagName)){ String age=xmlPullParser.nextText(); Log.i("test",age); }else if("image".equals(starttagName)){ String image=xmlPullParser.nextText(); Log.i("test",image); } break; case XmlPullParser.END_TAG: break; } //細(xì)節(jié): type=xmlPullParser.next(); } |
習(xí)慣用哪種可以自己去嘗試,個人覺得PULL比較簡便
新聞熱點
疑難解答