java pull 解析 xml

由于现在一般都是使用 json进行数据传递了,很少用到 xml格式的,所以,突然遇到,感觉特TM费劲。

痛定思痛,决定记录一下,以免下次抓瞎。

**大神镇楼: ** 【Android】PULL解析XML文件
【其实里面的示例代码有错误。】

我来:


import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.Locale;

public class XmlParseDemo {

    public static void main(String[] args) {

//        parse1();
        parseMsg();

    }

    private static void parseMsg(){
        XmlPullParserFactory factory;
        try {
            // 1. get parser
            factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(true);
            XmlPullParser parser = factory.newPullParser();
            FileInputStream in = new FileInputStream("big.xml");
            InputStreamReader reader = new InputStreamReader(in, StandardCharsets.UTF_8);
            parser.setInput(reader);

            //2. do parse
            int eventCode = parser.getEventType();//获取事件类型
            int pos = 0;
            while (true) {
                if (eventCode == XmlPullParser.END_DOCUMENT) {
                    System.err.println("last -> " + info(pos, eventCode, parser.getName()));
                    break;
                }
                System.err.println(info(pos, eventCode, parser.getName()));
                switch (eventCode) {
                    case XmlPullParser.START_DOCUMENT: //开始读取XML文档
                        //实例化集合类
                        break;
                    case XmlPullParser.START_TAG://开始读取某个标签
                        if ("person".equals(parser.getName())) {
                            //通过getName判断读到哪个标签,然后通过nextText()获取文本节点值,或通过getAttributeValue(i)获取属性节点值
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        break;
                }
                eventCode = parser.next();
                pos++;
            }

            System.err.println("finish parse of xml ###");

        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void parse1() {
        XmlPullParserFactory factory;
        try {
            // 1. get parser
            factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(true);
            XmlPullParser parser = factory.newPullParser();
            FileInputStream in = new FileInputStream("big.xml");
            InputStreamReader reader = new InputStreamReader(in, StandardCharsets.UTF_8);
            parser.setInput(reader);

            //2. do parse
            int eventCode = parser.getEventType();//获取事件类型
            int pos = 0;
            while (true) {
                if (eventCode == XmlPullParser.END_DOCUMENT) {
                    System.err.println("last -> " + info(pos, eventCode, parser.getName()));
                    break;
                }
                System.err.println(info(pos, eventCode, parser.getName()));
                switch (eventCode) {
                    case XmlPullParser.START_DOCUMENT: //开始读取XML文档
                        break;
                    case XmlPullParser.START_TAG://开始读取某个标签
                        break;
                    case XmlPullParser.END_TAG://
                        break;
                }
                eventCode = parser.next();
                pos++;
            }

            System.err.println("finish parse of xml ###");

        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static String info(Object... args) {
        return String.format(Locale.getDefault(),
                "line={%d},evenType={%d},name=%s", args[0], args[1], args[2]);
    }
}

这个 jar还挺不好找到的,网上找半天。

主要步骤就是:

  1. 获取 parser对象
  2. parser绑定到指定的xml文件上面。
  3. 循环遍历,跳出循环的条件是 eventCode == XmlPullParser.END_DOCUMENT(xml 读取结束了)
  4. 根据不同的类型做对应的逻辑。一般而言,就 XmlPullParser.START_TAG and XmlPullParser.TEXT 有用。
    • START_TAG:可以获取到里面属性;
    • TEXT:可以获取到里面的文本内容。

比如:


<person id="23">
	<name>孙洋洋</name>
	<age>30</age>
</person>

这里的 id="23" 是在 START_TAG 里面去获取的,parser.getName()获取到 tag 的名称。对应这里就是 "person"

这里的 30 就属于 TEXT ,通过 parser.getText() 可以获取到。

对于这里的 name, age 值的获取,还是链接里面给的方式可取

String name = parser.getName();
if (name.equalsIgnoreCase("name")) {
	currentPerson.setName(parser.nextText());// 如果后面是Text元素,即返回它的值
} else if (name.equalsIgnoreCase("age")) {
	currentPerson.setAge(new Short(parser.nextText()));
}

--------------------- 
作者:云涛连雾 
来源:CSDN 
原文:https://blog.csdn.net/jueblog/article/details/13164349 
版权声明:本文为博主原创文章,转载请附上博文链接!

以上~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值