android XML解析详解(封装好的工具类)

常见的XML解析有哪几种?

DOM解析;

PULL解析;(android自带的解析XML的技术)

JDOM解析;

SAX解析;

DOM4J

PULL解析示例代码:

<1>

我们要解析的XML文件已经放在本地应用的文件夹下或者是网络上的

注意:这样的话这两种情况都需要在功能清单文件下注册好权限。

<2>

XmlPullParser:XML拉式剖析器

android的pull解析有以下过程:

XmlPullParser.getEventType:主要获取当前解析器位于哪个节点上。

XmlPullParser.getName:主要是用来获取处在START_TAG或END_TAG事件时的xml标签名。

XmlPullParser.getText:主要是用来获取文本内容。

XmlPullParser.next():将解析器移动到下一个事件上,这样可以把所有xml文件遍历完.


(从网上获取)实例代码:

package com.example.tf.androidpull.com.example.utils;

import android.util.Xml;

import com.example.tf.androidpull.com.example.domin.Person;

import org.xmlpull.v1.XmlPullParser;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by TF on 2018/6/4.
 */
public class NetUtils {
    //将网络地址转化为输入流对象
    public static InputStream getInputStreamByPath(String path) throws Exception {
        URL url = new URL(path);
        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
        httpURLConnection.setConnectTimeout(3000);
        int responseCode = httpURLConnection.getResponseCode();
        if (responseCode == httpURLConnection.HTTP_OK) {
            return httpURLConnection.getInputStream();
        }
        return null;
    }
    //将输入流转化为字节数组
    public static byte[] getByteArrayByInputStream(InputStream inputStream) throws IOException {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = inputStream.read(buffer)) != -1) {
            byteArrayOutputStream.write(buffer, 0, len);
        }
        return byteArrayOutputStream.toByteArray();
    }
    //降输入流转化为字符串
    public static String getStringInputStream(InputStream inputStream) throws IOException {
        return new String(getByteArrayByInputStream(inputStream));
    }

    //解析xml
    //START_DOCUMENT:表示xml开始解析。END_DOCUMENT:表示xml解析结束


    public static List getPersonsByXmlString(String xml) throws Exception {
        List persons = new ArrayList<>();
        //得到Pull解析器对象
        XmlPullParser xmlPullParser = Xml.newPullParser();
        //设置需要解析的Xml数据
        xmlPullParser.setInput(new StringReader(xml));
        //得到事件对象
        int eventType = xmlPullParser.getEventType();
        while(eventType!=XmlPullParser.END_DOCUMENT){
            switch (eventType){
                case XmlPullParser.START_DOCUMENT:
                    System.out.println();
                    break;
                case XmlPullParser.START_TAG://开始标签
                    String startTag = xmlPullParser.getName();
                    System.out.println();
                    break;
                case XmlPullParser.TEXT://文本内容
                    String text = xmlPullParser.getText();
                    System.out.println();
                    break;
                case XmlPullParser.END_TAG://结束标签
                    String endTag = xmlPullParser.getName();
                    System.out.println();
                    break;
            }
                eventType = xmlPullParser.next();
             }
        return  persons;
    }
}


(从本地获取)实例代码:

package com.hsj.example.pullparsedemo09;

import android.content.res.AssetManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Xml;

import org.xmlpull.v1.XmlPullParser;

import java.io.InputStream;

public class MainActivity extends AppCompatActivity {

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


        //得到原生管理器对象
        AssetManager assetManager=getAssets();
        try {
            //调用原生管理器对象的open()方法传递需要读取的文件名,返回输入流对象
            InputStream inputStream=assetManager.open("persons.xml");

            //1.得到Xml解析器对象
           XmlPullParser parser= Xml.newPullParser();

            //2.指定解析器要解析的xml文件在哪里,这里以InputStream 的形式给予
            parser.setInput(inputStream,"utf-8");

            //3.得到事件类型
            int eventType=parser.getEventType();

            //XmlPullParser.START_DOCUMENT=0
            System.out.println("eventType="+eventType);

            //只要没有解析完毕指定的xml 文件则继续解析
            // XmlPullParser.END_DOCUMENT=1
            while (eventType!=XmlPullParser.END_DOCUMENT){
                switch (eventType){
                    //XmlPullParser.START_TAG=2:遇到开始标签时执行
                    case XmlPullParser.START_TAG:
                        //得到当前解析到的标签的名字
                        String starTag=parser.getName();
                        if("person".equals(starTag)){

                           String id= parser.getAttributeValue(0);
                            String isbn=parser.getAttributeName(1);

                            System.out.println("id="+id+",isbn="+isbn);
                        }else if("name".equals(starTag)){
                            //将事件流向后推进并返回解析到的内容
                            String name=parser.nextText();
                            System.out.println("name="+name);
                        }
                        System.out.println("startTag="+starTag);
                        break;

                    //XmlPullParser.TEXT=4:遇到文本节点时触发
                    /*case XmlPullParser.TEXT:

                        //得到文本内容
                       String text= parser.getText();
                        System.out.println("text="+text);
                        break;*/

                    case XmlPullParser.END_TAG:
                        //得到解析的标签名
                        String endTag=parser.getName();
                        System.out.println("endTag="+endTag);
                        break;
                }

                //将事件流继续向后推进
                eventType=parser.next();

            }


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




你可能感兴趣的:(android)