加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

解析xml文件

发布时间:2020-12-16 05:42:48 所属栏目:百科 来源:网络整理
导读:运行apache服务 在C:Program FilesApache Software FoundationApache2.4htdocs 文件里面新建一个 get_data.xml apps app id 1 / id name tom / name version 1 / version / app app id 2 / id name jerry / name version 2 / version / app / apps 使用P

运行apache服务
在C:Program FilesApache Software FoundationApache2.4htdocs
文件里面新建一个get_data.xml

<apps>
<app>
<id>1</id>
<name>tom</name>
<version>1</version>
</app>
<app>
<id>2</id>
<name>jerry</name>
<version>2</version>
</app>
</apps>

使用Pull解析

package com.example.testsometing;



import java.io.IOException;
import java.io.StringReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;



public class MainActivity extends Activity {


    Handler handler ;
    TextView tv_response;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        tv_response = (TextView) this.findViewById(R.id.response);
        handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                switch (msg.what) {
                case 1:
                    tv_response.setText(parseXMLWithPull(msg.obj.toString()));
                    break;
                default:
                    break;
                }
            }
        };



         new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    HttpClient httpClient = new DefaultHttpClient();
                    HttpGet httpGet = new HttpGet("http://10.0.2.2/get_data.xml");//指定访问的服务器地址是电脑本机
                    HttpResponse httpResponse = httpClient.execute(httpGet);
                    String response;
                    if(httpResponse.getStatusLine().getStatusCode() == 200){
                        //请求和相应都成功
                        HttpEntity entity = httpResponse.getEntity();
                        response = EntityUtils.toString(entity,"utf-8");
                    }
                    else{
                        response = "error";
                    }
                    Message msg = new Message();
                    msg.what = 1;
                    msg.obj = response;
                    handler.sendMessage(msg);


                } catch (ClientProtocolException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
            }

            ).start();
    }

    private String parseXMLWithPull(String str){
        String string = "";
        try {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser xmlPullParser = factory.newPullParser();
            xmlPullParser.setInput(new StringReader(str));

            int eventType = xmlPullParser.getEventType();
            String id = "";
            String name = "";
            String version = "";
            while(eventType!=XmlPullParser.END_DOCUMENT){
                String nodeName = xmlPullParser.getName();
                switch (eventType) {
                //开始解析某个节点
                case XmlPullParser.START_TAG:
                    if("id".equals(nodeName)){
                        id = xmlPullParser.nextText();
                    }else if("name".equals(nodeName)){
                        name = xmlPullParser.nextText();
                    }else if("version".equals(nodeName)){
                        version = xmlPullParser.nextText();
                    }
                    break;
                //完成解析某个节点
                case XmlPullParser.END_TAG:
                    if("app".endsWith(nodeName)){
                        string += id+":"+name+":"+version+"n";
                    }
                    break;
                default:
                    break;
                }
                eventType = xmlPullParser.next();
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return string;
    }
    }

使用SAX解析
ContentHandler.java

package com.example.handler;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;


public class ContentHandler extends DefaultHandler{

    private String nodeName;
    private StringBuilder id;
    private StringBuilder name;
    private StringBuilder version;
    public  String string = "";


    //重新5个方法
    @Override
    public void startDocument() throws SAXException {
        id = new StringBuilder();
        name = new StringBuilder();
        version = new StringBuilder();

    }


    @Override
    public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException {
        //记录当前的结点名
        nodeName = localName;
    }


    @Override
    public void characters(char[] ch,int start,int length)
            throws SAXException {
        super.characters(ch,start,length);
        //根据当前的结点名判断将内容添加到哪一个StringBuilder
        if("id".equals(nodeName)){
            id.append(ch,length);
        }else if("name".equals(nodeName)){
            name.append(ch,length);
        }else if("version".equals(nodeName)){
            version.append(ch,length);
        }

    }

    @Override
    public void endElement(String uri,String qName)
            throws SAXException {
        if("app".equals(localName)){
            string += id.toString().trim()+":"+name.toString().trim()+":"+version.toString().trim()+"n";
            //清空StringBuilder
            id.setLength(0);
            name.setLength(0);
            version.setLength(0);
        }
        //因为上面的3行没有用{}起来,花了1个小时检查这个bug。。。。醉了

    }


    @Override
    public void endDocument() throws SAXException {
        // TODO Auto-generated method stub
    }


    //
    public String getString(){
        return string;
    }

}

MainActivity.java

package com.example.testsometing;



import java.io.IOException;
import java.io.StringReader;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import com.example.handler.ContentHandler;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;



public class MainActivity extends Activity {


    Handler handler ;
    TextView tv_response;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        tv_response = (TextView) this.findViewById(R.id.response);
        handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                switch (msg.what) {
                case 1:
                    tv_response.setText(parseXMLWithSAX(msg.obj.toString()));
                    break;
                default:
                    break;
                }
            }
        };



         new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    HttpClient httpClient = new DefaultHttpClient();
                    HttpGet httpGet = new HttpGet("http://10.0.2.2/get_data.xml");//指定访问的服务器地址是电脑本机
                    HttpResponse httpResponse = httpClient.execute(httpGet);
                    String response;
                    if(httpResponse.getStatusLine().getStatusCode() == 200){
                        //请求和相应都成功
                        HttpEntity entity = httpResponse.getEntity();
                        response = EntityUtils.toString(entity,"utf-8");
                    }
                    else{
                        response = "error";
                    }
                    Message msg = new Message();
                    msg.what = 1;
                    msg.obj = response;
                    handler.sendMessage(msg);


                } catch (ClientProtocolException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
            }

            ).start();
    }

    private String parseXMLWithSAX(String str){
        String string = "";

        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            XMLReader xmlReader = factory.newSAXParser().getXMLReader();
            ContentHandler contentHandler = new ContentHandler();
            //将ContentHandler实例设置到XMLReader中
            xmlReader.setContentHandler(contentHandler);
            //开始解析
            xmlReader.parse(new InputSource(new StringReader(str)));
            string = contentHandler.getString();
        }  catch (IOException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
        return string;
    }

    }

效果

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读