Android之解析XML格式数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android之解析XML格式数据相关的知识,希望对你有一定的参考价值。

作用:在网络上传输数据时最常用的格式有两种,XML 和 JSON。解析XML格式数据获得与后台交互的信息。

种类:

3种:Pull 解析方式;SAX 解析方式;DOM解析方式。

1.使用Pull解析器解析XML文档
Pull解析器的运行方式和SAX解析器很相似,它提供了类似的事件,比如文档开始、文档结束、开始元素和结束元素等。使用parser.next()方法可以进入下一个元素并触发相应的事件。各种事件均已数字的形式被发送,因此可以在程序中使用一个switch语句来对事件进行选择,然后进行相应的事件处理。
1.1事件类型
Pull解析器提供的事件类型总共有5种,分别如下:
(1)START_DOCUMENT         文档开始
(2)START_TAG                    开始元素
(3)TEXT           文本
(4)END_TAG        结束元素
(5)END_DOCUMENT     文档结束
1.2常用方法
使用Pull解析器XmlPullParser解析XML文档时,主要会用到以下几个常用方法。
(1)int getAttributeCount();         //获取当前元素的属性个数
(2)String getAttributeValue(int index);   //获取属性值
(3)int getEventType();           //获取事件类型
(4)String getName();                                //用于START_TAG和END_TAG事件中,获取当前元素的名字
(5)int next();                                             //处理下一个元素
(6)int nextText();              //用于START_TAG事件中,获得下一个TEXT类型的元素

使用步骤

1. 先搭建WEB服务器。给定一个XML文件进行测试。

2. 通过XmlPullParserFactory获得XmlPullParser对象进行解析。

3. XmlPullParser对象解析文档。

详细步骤

1. 先搭建WEB服务器。给定一个XML文件进行测试。

<?xml version="1.0" encoding="UTF-8"?>
<Users>
    <User>
        <Name>h_bolin</Name>
        <Pwd>0</Pwd>
    </User>
    <User>
        <Name>h_bolin1</Name>
        <Pwd>12</Pwd>
    </User>
    <User>
        <Name>h_bolin2</Name>
        <Pwd>123</Pwd>
    </User>
    <User>
        <Name>h_bolin3</Name>
        <Pwd>1234</Pwd>
    </User>
    <User>
        <Name>h_bolin4</Name>
        <Pwd>12345</Pwd>
    </User>
    <User>
        <Name>h_bolin5</Name>
        <Pwd>123456</Pwd>
    </User>
</Users>

2. 通过XmlPullParserFactory获得XmlPullParser对象进行解析。

XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlData));

3. XmlPullParser对象解析文档。

int eventType = xmlPullParser.getEventType();
            String name = "";
            String pwd = "";
            while (eventType != XmlPullParser.END_DOCUMENT) {
                String nodeName = xmlPullParser.getName();
                switch (eventType) {
                case XmlPullParser.START_DOCUMENT:
                    // 文档开始的时可以的操作
                    break;
                // 开始解析某个结点
                case XmlPullParser.START_TAG: {
                    if ("Name".equals(nodeName)) {
                        name = xmlPullParser.nextText();
                    } else if ("Pwd".equals(nodeName)) {
                        pwd = xmlPullParser.nextText();
                    }
                    break;
                }// 完成解析某个结点
                case XmlPullParser.END_TAG: {
                    if ("User".equals(nodeName)) {
                        Log.d("h_bl", "Name is" + name);
                        Log.d("h_bl", "Pwd is " + pwd);
                        users.add(new User(name, pwd));
                    }
                    break;
                }
                default:
                    break;
                }
                eventType = xmlPullParser.next();
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

详细代码:

@SuppressLint("HandlerLeak")
public class MainActivity extends Activity implements OnClickListener {
    private Button bt_getData;
    private TextView tv_show_data;
    private List<User> users = new ArrayList<User>(); // 数据解析

    private static final int GET_DATA_OK = 0;
    // Handler机种更新UI
    private Handler handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case GET_DATA_OK:
                for (User user : users) {
                    tv_show_data.append(user.getName() + "\n");
                    tv_show_data.append(user.getPwd() + "\n");
                }
                break;

            default:
                break;
            }
            super.handleMessage(msg);
        }

    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    private void init() {
        bt_getData = (Button) findViewById(R.id.bt_getData);
        tv_show_data = (TextView) findViewById(R.id.tv_show_data);
        bt_getData.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.bt_getData:
            getData();
            break;

        default:
            break;
        }
    }

    /**
     * 获取数据
     */
    private void getData() {
        new Thread(new Runnable() {

            @Override
            public void run() {
                Log.d("h_bl", "进入执行");
                HttpClient httpClient = new DefaultHttpClient();
                HttpGet httpGet = new HttpGet("http://h-bolin.imwork.net/SendXMLData/SendData.xml");
                HttpResponse httpResponse = null;
                try {
                    httpResponse = httpClient.execute(httpGet);
                    if (httpResponse.getStatusLine().getStatusCode() == 200) {
                        // 请求和响应都成功了
                        Log.d("h_bl", "响应成功");
                        HttpEntity entity = httpResponse.getEntity();
                        String response = EntityUtils.toString(entity, "utf-8");
                        users = parseXMLWithPull(response);
                        Message message = new Message();
                        message.what = GET_DATA_OK;
                        // 将服务器返回的结果存放到Message中
                        handler.sendMessage(message);
                    }
                } catch (ClientProtocolException e) {
                    Log.d("h_bl", "链接失败");
                    e.printStackTrace();
                } catch (IOException e) {
                    Log.d("h_bl", "链接IO异常");
                    e.printStackTrace();
                }

            }
        }).start();
    }

    /**
     * PULL解析XML文件
     */
    private List<User> parseXMLWithPull(String xmlData) {
        List<User> users = new ArrayList<User>();
        try {
            XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
            XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser();
            xmlPullParser.setInput(new StringReader(xmlData));
            int eventType = xmlPullParser.getEventType();
            String name = "";
            String pwd = "";
            while (eventType != XmlPullParser.END_DOCUMENT) {
                String nodeName = xmlPullParser.getName();
                switch (eventType) {
                case XmlPullParser.START_DOCUMENT:
                    // 文档开始的时可以的操作
                    break;
                // 开始解析某个结点
                case XmlPullParser.START_TAG: {
                    if ("Name".equals(nodeName)) {
                        name = xmlPullParser.nextText();
                    } else if ("Pwd".equals(nodeName)) {
                        pwd = xmlPullParser.nextText();
                    }
                    break;
                }// 完成解析某个结点
                case XmlPullParser.END_TAG: {
                    if ("User".equals(nodeName)) {
                        Log.d("h_bl", "Name is" + name);
                        Log.d("h_bl", "Pwd is " + pwd);
                        users.add(new User(name, pwd));
                    }
                    break;
                }
                default:
                    break;
                }
                eventType = xmlPullParser.next();
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return users;
    }
}

PS.节点区分大小写。

以上是关于Android之解析XML格式数据的主要内容,如果未能解决你的问题,请参考以下文章

Android之DOM解析XML

Android 之XML数据解析—— SAX解析

Android之JSON格式数据解析

Android :安卓第一行代码学习笔记之 解析JSON格式数据

数据解析之XML和JSON

为 Blogger 上的博客格式化代码片段 [关闭]