解析XML是在java编译工作中最重要的一步,比如我们访问某网站,我们就需要获取它的数据,我们发出请求,服务器
做出响应。然后根据传过来的数据判断,是XML或是JSON.我们今天了解一下解析XML。
首先配置网络环境。我们模拟一下场景。
1.开启TomCat,搭建服务器
2.在root目录下放入一个写好XML文件
3.输入DOS命令---ipconfig,复制生成一串ip地址,在浏览器中测试打印出文件
配置好久开始代码编写。解析XML有三种方式。第一种是DOM,不常用,他比较耗资源,需要一次性全部加载
public void parseXML(View view){ new MyTask().execute(); } //线程间通信机制 //子线程+Handler //异步任务类 AsyncTask class MyTask extends AsyncTask{ @Override protected Object doInBackground(Object[] objects) { //01.获取网络XML数据 //原生态底层: //URLConnection try { URL url=new URL("http://192.168.43.135/persons.xml"); HttpURLConnection connection= (HttpURLConnection) url.openConnection(); //设置请求方式‘ connection.setRequestMethod("GET"); //设置请求连接超时的时间(优化) connection.setConnectTimeout(5000); //获取结果码 int code=connection.getResponseCode(); if(code==200){ //获取服务器返回过来的结果 InputStream is=connection.getInputStream(); //打印(读)--》测试 // 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); // //获取跟标签 // Element root=document.getDocumentElement(); // Log.i("test","跟标签:"+root.getNodeName()); // // //获取<persons>下面的所有的子标签<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>下面的子标签<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); // } |
第二种SAX,特点是边读边解析,在这里将主要代码粘贴,其余同上
//02.SAX(边读边解析,基于事件(方法)驱动方式) // 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; // //获取开始标签的名字 // 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。也是安卓开发中用的最多的一种
//03.使用PULL解析(类似SAX) XmlPullParser xmlPullParser=Xml.newPullParser(); xmlPullParser.setInput(is,"UTF-8"); //获取解析的标签的类型 int type=xmlPullParser.getEventType(); while(type!=XmlPullParser.END_DOCUMENT){ switch (type) { case XmlPullParser.START_TAG: //获取开始标签名字 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; } //细节: type=xmlPullParser.next(); } |
习惯用哪种可以自己去尝试,个人觉得PULL比较简便