解析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);// } |
//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比较简便
新闻热点
疑难解答