在Android中提供了三种解析XML的方式:DOM(Document Objrect Model),SAX(Simple API XML),以及android推荐的Pull解析方式.
第一种:DOM解析
DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。
Node对象提供了一系列常量来代表结点的类型,当开发人员获得某个Node类型后,
就可以把Node节点转换成相应节点对象(Node的子类对象),以便于调用其特有的方法。
Node对象提供了相应的方法去获得它的父结点或子结点。
编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容.
缺点: 一次性的完全加载整个xml文件,需要消耗大量的内存。
- class MyTask extends AsyncTask{
- @Override
- protected Object doInBackground(Object[] params) {
- //获取网络XML数据
- try {
- URL url=new URL("http://192.168.1.110:8080/person.xml");
- HttpURLConnection connection= (HttpURLConnection) url.openConnection();
- //设置请求方式
- connection.setRequestMethod("GET");
- //设置连接超时的时间(优化)
- connection.setConnectTimeout(5000);
- //结果码(状态)//成功200 失败 未修改304
- //获取结果码
- int code=connection.getResponseCode();
- if(code==200){
- //获取服务器返回来额结果
- InputStream is=connection.getInputStream();
- //解析XMLDOM解析=====================================
- DocumentBuilderFactory documentBuilderFactory= DocumentBuilderFactory.newInstance();
- DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder();
- Document document= documentBuilder.parse(is);
- //获取根标签
- Element element=document.getDocumentElement();
- Log.i("test","根标签:"+element.getNodeName());
- NodeList nodeList=element.getElementsByTagName("person");
- for (int i = 0; i < nodeList.getLength(); i++) {
- //获取单个
- Element personElement= (Element) nodeList.item(i);
- //获取<person>属性id的值
- String id= personElement.getAttribute("id");
- Log.i("test",id);
- //获取<person>下面的子标签<name><age>的值
- Element nameElement= (Element) personElement.getElementsByTagName("name").item(0);
- String name= nameElement.getTextContent();
- Element ageElement= (Element) personElement.getElementsByTagName("age").item(0);
- String age=ageElement.getTextContent();
- Log.i("test",name+" "+age);
- }
- }
- } catch (MalformedURLException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }catch (SAXException e) {
- e.printStackTrace();
- }catch (ParserConfigurationException e) {
- e.printStackTrace();
- }
- return null;
- }
第二种SAX解析:
SAX是事件驱动型XML解析的一个标准接口不会改变 SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。
Sax解析代码如下
- class MyTask extends AsyncTask{
- @Override
- protected Object doInBackground(Object[] params) {
- //获取网络XML数据
- try {
- URL url=new URL("http://192.168.1.110:8080/person.xml");
- HttpURLConnection connection= (HttpURLConnection) url.openConnection();
- //设置请求方式
- connection.setRequestMethod("GET");
- //设置连接超时的时间(优化)
- connection.setConnectTimeout(5000);
- //结果码(状态)//成功200 失败 未修改304
- //获取结果码
- int code=connection.getResponseCode();
- if(code==200){
- //获取服务器返回来额结果
- InputStream is=connection.getInputStream();
- //解析XMLSax解析=====================================
- //(边读边解析)
- SAXParserFactory saxParseFactory=SAXParserFactory.newInstance();
- SAXParser saxParse= saxParseFactory.newSAXParser();
- saxParse.parse(is,new DefaultHandler(){
- @Override
- public void startDocument() throws SAXException {
- super.startDocument();
- Log.i("test","开始文档");
- }
- @Override
- public void endDocument() throws SAXException {
- super.endDocument();
- Log.i("test","结束文档");
- }
- @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);
- }
- }
- });
- }
- } catch (MalformedURLException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (ParserConfigurationException e) {
- e.printStackTrace();
- } catch (SAXException e) {
- e.printStackTrace();
- }
- return null;
- }
第三种PULL解析(类似SAX)
- //异步任务类AsyncTask
- class MyTask extends AsyncTask{
- @Override
- protected Object doInBackground(Object[] params) {
- //获取网络XML数据
- try {
- URL url=new URL("http://192.168.1.110:8080/person.xml");
- HttpURLConnection connection= (HttpURLConnection) url.openConnection();
- //设置请求方式
- connection.setRequestMethod("GET");
- //设置连接超时的时间(优化)
- connection.setConnectTimeout(5000);
- //结果码(状态)//成功200 失败 未修改304
- //获取结果码
- int code=connection.getResponseCode();
- if(code==200){
- //获取服务器返回来额结果
- InputStream is=connection.getInputStream();
- //使用PULL解析
- 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 starttgname = xmlPullParser.getName();
- if ("person".equals(starttgname)) {
- //获取id的值
- String id = xmlPullParser.getAttributeValue(0);
- Log.i("test", id);
- } else if ("name".equals(starttgname)) {
- String name = xmlPullParser.nextText();
- Log.i("test", name);
- } else if ("age".equals(starttgname)) {
- String age = xmlPullParser.nextText();
- Log.i("test", age);
- }
- break;
- case XmlPullParser.END_TAG:
- break;
- }//细节:
- type=xmlPullParser.next();
- }
- }
- } catch (MalformedURLException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }catch (XmlPullParserException e) {
- e.printStackTrace();
- }
- return null;
- }