Android 解析XML(DOM解析,SAX解析,PULL解析)

一.Android 实现解析XML ,

         DOM解析,SAX解析 ,以及PULL解析

    

public class MainActivity extends AppCompatActivity {

    private String CurrentTag=null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件
        initview();
    }

    //初始化控件
    private void initview(){
       Button ParseXml_btn = (Button) findViewById(R.id.ParseXml_btn);

        //解析XML
        ParseXml_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new MyTask().execute();
            }
        });

    }

    //线程间通信机制
    //子线程+Handler
    //异步任务类 AsyncTask
    class MyTask extends AsyncTask{

        @Override
        protected Object doInBackground(Object[] objects) {

         try {
             //目标地址
             URL url=new URL("http://192.137.43.125/persons.xml");
                //打开请求
                HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                //设置请求方式
                httpURLConnection.setRequestMethod("GET");
                //设置超时请求(5秒)
                httpURLConnection.setConnectTimeout(5000);

                //获取返回结果码
                int code = httpURLConnection.getResponseCode();
                //成功 200
                if(code==200){
                    //获取服务器返回的结果
                   InputStream is = httpURLConnection.getInputStream();
                    //打印输出 调试
//                    BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(is));
//                    String str=null;
//                    while ((str=bufferedReader.readLine())!=null){
//                        Log.i("tests",str);
//                    }
        //一.原生态获取XML  使用DOM
//                   DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//                   DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
//
//                   //转换成Document 对象
//                   Document document = documentBuilder.parse(is);
//                   //获取跟节点
//                   Element root = document.getDocumentElement();
//
//                   //获取根节点 下所有的子节点对象
//                   NodeList nodeList = root.getElementsByTagName("person");
//
//                   //遍历 输出
//                    for (int i = 0; i < nodeList.getLength(); i++) {
//                       //获取单个 子节点对象
//                       Element personElemnet = (Element) nodeList.item(i);
//                       //获取子节点对象  属性id
//                       String id=personElemnet.getAttribute("id");
//
//                       //获取该子节点 下标签的值
//                       Element nameElement = (Element) personElemnet.getElementsByTagName("name").item(0);
//                       String name=nameElement.getTextContent();
//
//                       Element ageElement = (Element) personElemnet.getElementsByTagName("age").item(0);
//                       String age=ageElement.getTextContent();
//
//                        Log.i("tests","id:"+id+"  age:"+age+"  name:"+name);
//                    }


//       //二.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);
//                            //赋值 标签名字
//                            CurrentTag=localName;
//                            if("person".equals(localName)){
//                                //取出属性 id
//                                String id=attributes.getValue(0);
//                                Log.i("tests",id);
//                            }
//
//
//                        }
//
//                        //结束标签
//                        @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);
//                            //判断CurrentTag的值
//                            if("name".equals(CurrentTag)){
//                                String name=new String(ch,start,length);
//                                Log.i("tests",name);
//                            }else if("age".equals(CurrentTag)){
//                                  String age=new String(ch,start,length);
//                                Log.i("tests",age);
//                            }
//
//                        }
//
//                    });
//
//       //三.使用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 TagName=xmlPullParser.getName();
                                  if("person".equals(TagName)){
                                      String id=xmlPullParser.getAttributeName(0);
                                      Log.i("tests",id);
                                  }else if("name".equals(TagName)){
                                      String name=xmlPullParser.nextText();
                                      Log.i("tests",name);
                                  }else if("age".equals(TagName)){
                                      String age=xmlPullParser.nextText();
                                      Log.i("tests",age);
                                  }

                               break;
                           case XmlPullParser.END_TAG:
                               break;

                       }
                       //细节  type的变化
                     type=xmlPullParser.next();
                   }

                }

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
             e.printStackTrace();
           } catch (XmlPullParserException e) {
             e.printStackTrace();
         }
//         catch (ParserConfigurationException e) {
//             e.printStackTrace();
//         } catch (SAXException e) {
//             e.printStackTrace();
//         }
// catch (ParserConfigurationException e) {
//             e.printStackTrace();
//         } catch (SAXException e) {
//             e.printStackTrace();
//         }

            return null;
        }

        @Override
        protected void onPostExecute(Object o) {
            super.onPostExecute(o);
            //展示解析的结果
        }

    }
}
    因为解析XML是耗时操作,所以用了  异步任务类 AsyncTask来执行操作

   具体操作 看以上代码

   


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值