必威体育Betway必威体育官网
当前位置:首页 > IT技术

解析XML格式数据实例

时间:2019-10-08 08:14:29来源:IT技术作者:seo实验室小编阅读:89次「手机版」
 

xml格式

前言:

网络数据传输时,最常用的格式有两种:XML和JSON,下面我们就研究如何使用Pull解析和Sex解析来实现对xml格式文件数据的解析。

实例流程:

1.创建服务器:Apache服务器(用于模拟解析网络中的数据)

2.在apache安装目录下的htdocs目录下创建xml格式的文件(用于解析)

3.使用Pull方法解析XML数据

4.使用SAX方法解析XML数据

实例完整步骤:

1.创建服务器(可以借鉴这篇博客创建自己的服务器,我就是看这篇的博客)

https://www.cnblogs.com/yerenyuan/p/5460336.html

2.在Apache安装目录下的htdocs目录下创建xml格式的文件(用于解析),我创建了get_data.xml文件,内容为:
<APPs>
    <app>
        <id>1</id>
        <name>Google Maps</name>
        <virsion>1.0</virsion>
    </app>
    <app>
        <id>2</id>
        <name>Chrome</name>
        <version>2.1</version>
    </app>
    <app>
        <id>3</id>
        <name>google play</name>
        <version>2.3</version>
    </app>
</apps>

登录http://127.0.0.1/get_data.xml,可以看看是否创建成功,如下图:

这里写图片描述

好了,这就是我们需要的准备工作,下面我们来实现使用Pull解析xml格式的数据。
3.使用Pull方法解析XML数据,代码如下:

首先是布局文件,添加一个button控件就可以了:

<?xml version="1.0" encoding="utf-8"?>
<Linearlayout xmlns:Android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.networktest.MainActivity">

    <Button
        android:id="@+id/send_request_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="send request" />



</LinearLayout>

接着我们来修改java代码部分:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "MainActivity";
    private Button requestBtn;

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

    private void bindID() {
        requestBtn = findViewById(R.id.send_request_btn);
        requestBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.send_request_btn:
                requestwithHttpURLConnection();
                break;
            default:
                break;
        }
    }

    private void requestWithHttpURLConnection() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                //这里我使用了okhttp插件实现访问网络数据,有什么不懂可以看我的前一篇博客
                Okhttpclient client = new OkHttpClient();
                Request request = new Request.builder()
                        //这里是将要访问的网络,其中10.0.2.2对Android模拟器来说是计算机本机的IP地址
                        .url("http://10.0.2.2/get_data.xml")
                        .build();
                try {
                    final response response = client.newCall(request).execute();
                    String responseData = response.body().string();
                    //调用自定义的parseXMLWithPull()方法实现对XML数据的解析
                    parseXMLWithPull(responseData);
                } catch (IOException e) {
                    e.printstacktrace();
                }

            }
        }).start();
    }

    private void parseXMLWithPull(String xmlData) {
        try {
            //首先获得XmlPullparserFactory对象
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            //获得XmlPullParser对象
            XmlPullParser xmlPullParser = factory.newPullParser();
            //调用setPut()方法将服务器返回的数据放入xmlPullParser中
            xmlPullParser.setInput(new StringReader(xmlData));
            //获得当前解析事件
            int eventType = xmlPullParser.getEventType();
            String id = null;
            String name = null;
            String version = null;
            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".equals(nodeName)) {
                            //当前解析事件结束,打印出解析的结果
                            Log.e(TAG, "parseXMLWithPull: " + "id=" + id);
                            Log.e(TAG, "parseXMLWithPull: " + "name=" + name);
                            Log.e(TAG, "parseXMLWithPull: " + "version" + version);
                        }
                        break;
                    default:
                        break;

                }
                //获得下一个解析事件
                eventType = xmlPullParser.next();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
over
效果展现:

这里写图片描述

4.使用SAX方法解析XML数据

1.新建类继承Defaulthandler重写五种方法:

public class ContentHandler extends DefaultHandler {

    private String nodeName;
    private stringbuilder id;
    private StringBuilder name;
    private StringBuilder version;
    private static final String TAG = "ContentHandler";
    //开始xml解析的时候被调用
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        id = new StringBuilder();
        name = new StringBuilder();
        version = new StringBuilder();
    }
    //开始解析某个节点时被调用
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        //获取当前节点名
        nodeName = localName;
    }
    //获取当前节点的内容
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        if ("id".equals(nodeName)){
            id.append(ch,start,length);
        }else if("name".equals(nodeName)){
            name.append(ch,start,length);
        }else if("version".equals(nodeName)){
            version.append(ch,start,length);
        }
        //Log.e(TAG, "characters: "+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh" );
    }
    //完成解析某个节点时被调用
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        if("app".equals(localName)){
            //因为characters()方法可能将一些换行符读入,所以要调用trim()方法
            Log.e(TAG, "endElement: "+"id="+id.toString().trim());
            Log.e(TAG, "endElement: "+"name="+name.toString().trim() );
            Log.e(TAG, "endElement: "+"version="+version.toString().trim() );
            //不要忘了将stringbuilder清空
            id.setLength(0);
            name.setLength(0);
            version.setLength(0);
        }
    }

    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }
}
java代码出调用:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    ...........
    private void requestWithHttpURLConnection() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                //这里我使用了OKHttp插件实现访问网络数据,有什么不懂可以看我的前一篇博客
                OkHttpClient client = new OkHttpClient();
                Request request = new Request.Builder()
                        //这里是将要访问的网络,其中10.0.2.2对Android模拟器来说是计算机本机的IP地址
                        .url("http://10.0.2.2/get_data.xml")
                        .build();
                try {
                    final Response response = client.newCall(request).execute();
                    String responseData = response.body().string();
                    //调用自定义的parseXMLWithSEX()方法实现对XML数据的解析
                    parseXMLWithSEX(responseData);
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }).start();
    }

    private void parseXMLWithSEX(String xmlData) {
        try {

            SAXParserFactory factory = SAXParserFactory.newInstance();
            XMLReader xmlReader = factory.newSAXParser().getXMLReader();
            ContentHandler contentHandler = new ContentHandler();
            //使用setContentHandler()方法将ContentHandler对象放入xmlReader中
            xmlReader.setContentHandler(contentHandler);
            //解析xml数据
            xmlReader.parse(new InputSource(new StringReader(xmlData)));

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}
over,运行效果和之前的一样

相关阅读

Web.xml文件中context-param使用(转)

申明:此篇博文为转载博文,原博文地址:https://www.cnblogs.com/jiaguozhilian/p/5819032.html <context-param>的作用:web.xml的配置

支持wmv、mpg、mov、avi格式的网页视频播放代码

这2天一直在整金网奖的相关项目,比较头大的就是网页视频播放了,需要考虑各种不同格式的视频,然后找相应的视频播放器。 这次使用了2

图像和流媒体 -- 详解YUV数据格式

如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78283369 我们在讲 FFmpeg 系列的时候,有提到 YUV 的。其

【JS】获取当前时间,且格式为yyyy-MM-dd hh:mm:ss

我们在前端获取当前时间:var nowDate = new Date();时间格式为:Sun May 27 2018 19:28:09 GMT+0800 (中国标准时间)但是我们想在页

web.xml中contextConfigLocation的作用

在web.xml中通过contextConfigLocation配置spring,contextConfigLocation参数定义了要装入的 Spring 配置文件。 1. 在web.xml里配

分享到:

栏目导航

推荐阅读

热门阅读