我们手机通常使用的时候,需要一些数据如朋友圈、QQ空间等等,那么那些数据肯定是不在手机内存,而是在服务器里,我们通过请求数据,看它响应过来的是什么文件(通常是XML、JSON),然后根据服务器传过来的文件,进行相应的解析,拿到我们所需要的数据。
现在我就写怎么解析XML文件的吧!
解析XML一共有三种方法,第一种是最底层的、第二种是SAX,第三种是PULL。
一、解析XML文件之前,首先要得到你要解析的网络数据(URLConnection),在后台打印输出一下

//你要解析文件的路径
URL url=new URL("http://www.w3school.com.cn/example/xmle/plant_catalog.xml");
                HttpURLConnection connection=(HttpURLConnection)url.openConnection();
                //设置请求方式
                connection.setRequestMethod("GET");
                //设置请求连接超时的时间(优化)
                connection.setConnectTimeout(5000);
                //结果码(成功:200,失败:404,304,500....)
                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);
                    }

接下来就开始解析了:
<1>底层做法(常说的DOM解析):

DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
                    DocumentBuilder documentBuilder=(DocumentBuilder) documentBuilderFactory.newDocumentBuilder();
                    Document document=documentBuilder.parse(is);
                    //获取根标签
                    Element root=document.getDocumentElement();
                    //根标签为:CATALOG
                    Log.i("test","根标签为:"+root.getNodeName());
                    //获取<CATALOG>下面的子标签
                    NodeList nodeList=root.getElementsByTagName("PLANT");
                    for (int i = 0; i <nodeList.getLength() ; i++) {
                        //获取单个
                        Element element= (Element) nodeList.item(i);
                        //获取属性id的值
//                        String id=element.getAttribute("id");
//                        Log.i("test",element+"oooooo");
                        Element COMMONelement= (Element) element.getElementsByTagName("COMMON").item(0);
                        String COMMON=COMMONelement.getTextContent();

                        Element BOTANICALelement= (Element) element.getElementsByTagName("BOTANICAL").item(0);
                        String BOTANICAL=BOTANICALelement.getTextContent();

                        Element ZONEelement= (Element) element.getElementsByTagName("ZONE").item(0);
                        String ZONE=ZONEelement.getTextContent();

                        Element LIGHTelement= (Element) element.getElementsByTagName("LIGHT").item(0);
                        String LIGHT=LIGHTelement.getTextContent();

                        Element PRICEelement= (Element) element.getElementsByTagName("PRICE").item(0);
                        String PRICE=PRICEelement.getTextContent();

                        Element AVAILABILITYelement= (Element) element.getElementsByTagName("AVAILABILITY").item(0);
                        String AVAILABILITY=AVAILABILITYelement.getTextContent();

                        Log.i("test",ZONE+"     价格是"+PRICE);
                    }

<2>、SAX解析(边读边解析),要实现5个方法

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);
                            currentTag=localName;
                            //获取开始标签名

                        }

                        @Override
                        public void endElement(String uri, String localName, String qName) throws SAXException {
                            super.endElement(uri, localName, qName);
                            currentTag=null;
                        }

                        @Override
                        public void characters(char[] ch, int start, int length) throws SAXException {
                            super.characters(ch, start, length);
                            if("COMMON".equals(currentTag)){
                                //得到COMMON的值
                                String COMMON=new String(ch,start,length);
                                Log.i("test","第一个:"+COMMON);
                            }else if("BOTANICAL".equals(currentTag)){
                                //得到BOTANICAL的值
                                String BOTANICAL=new String(ch,start,length);
                                Log.i("test","第二个:"+BOTANICAL);
                            }else if("ZONE".equals(currentTag)){
                                //得到ZONE的值
                                String ZONE=new String(ch,start,length);
                                Log.i("test","第三个:"+ZONE);
                            }else if("LIGHT".equals(currentTag)){
                                //得到LIGHT的值
                                String LIGHT=new String(ch,start,length);
                                Log.i("test","第四个:"+LIGHT);
                            }else if("PRICE".equals(currentTag)){
                                //得到PRICE的值
                                String PRICE=new String(ch,start,length);
                                Log.i("test","第五个:"+PRICE);
                            }else if("AVAILABILITY".equals(currentTag)){
                                //得到AVAILABILITY的值
                                String AVAILABILITY=new String(ch,start,length);
                                Log.i("test","第六个:"+AVAILABILITY);
                            }
                        }
                    });

<3>、使用PULL解析

XmlPullParser xmlpullparse=Xml.newPullParser();
                    xmlpullparse.setInput(is,"UTF-8");

                    //获取解析的标签的类型
                    int type=xmlpullparse.getEventType();
                    while (type!=xmlpullparse.END_DOCUMENT){
                        switch (type){
                            case XmlPullParser.START_TAG:
                                //获取标签名字
                                String startTag=xmlpullparse.getName();
                                if("PLANT".equals(startTag)){
                                    Log.i("test","我是第一个标签");
                                }else if("COMMON".equals(startTag)){
                                    String COMMON=xmlpullparse.nextText();
                                    Log.i("test",COMMON);
                                }else if("BOTANICAL".equals(startTag)){
                                    String BOTANICAL=xmlpullparse.nextText();
                                    Log.i("test",BOTANICAL);
                                }else if("ZONE".equals(startTag)){
                                    String ZONE=xmlpullparse.nextText();
                                    Log.i("test",ZONE);
                                }else if("LIGHT".equals(startTag)){
                                    String LIGHT=xmlpullparse.nextText();
                                    Log.i("test",LIGHT);
                                }else if("PRICE".equals(startTag)){
                                    String PRICE=xmlpullparse.nextText();
                                    Log.i("test",PRICE);
                                }else if("AVAILABILITY".equals(startTag)){
                                    String AVAILABILITY=xmlpullparse.nextText();
                                    Log.i("test",AVAILABILITY);
                                }
                            case XmlPullParser.END_TAG:

                        }

                        //细节:
                        type=xmlpullparse.next();
                    }

注意:这是一个耗时操作,要写在子线程+Handler或者异步任务类AsyncTask中,不然会报错,还要写获得网络数据的权限

<uses-permission android:name="android.permission.INTERNET"></uses-permission>