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

Pull解析器解析XML文件

发布时间:2020-12-16 00:29:32 所属栏目:百科 来源:网络整理
导读:Android 内部采用 Pull 解析器对 XML 进行解析。 Pull 解析器解析原理: 读取 XML 数据到字符数组中; 开始解析――挨个字符读取XML文件,判断是否符合 XMl 语法,如符合,则会触发对应的事件。 下面通过一个例子来说明。 比如要解析如下XML文件 ?xml versio

Android内部采用Pull解析器对XML进行解析。

Pull解析器解析原理:

  1. 读取XML数据到字符数组中;

  2. 开始解析――挨个字符读取XML文件,判断是否符合XMl语法,如符合,则会触发对应的事件。

下面通过一个例子来说明。

  1. 比如要解析如下XML文件

    <?xml version="1.0" encoding="UTF-8"?>
    <persons>
        <person id="10">
            <name>gaohao</name>
            <age>25</age>
        </person>
        <person id="11">
            <name>gaofeng</name>
            <age>31</age>
        </person>
    </persons>
  2. 在domain层新建Person类,存放从XML解析出来的数据

  3. public class Person {
        private Integer id;
        private String name;
        private Integer age;
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Integer getAge() {
            return age;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return "Person [id=" + id + ",name=" + name + ",age=" + age + "]";
        }
    }

  4. 在业务层新建PersonService类,解析XML文件

    public class PersonService {
        public static List<Person> getPersons(InputStream xml) throws Exception{
            List<Person> persons = null;
            Person person = null;
            //使用Pull解析XML文件
            //XmlPullParser pullParser = XmlPullParserFactory.newInstance().newPullParser();//得到Pull解析器
            XmlPullParser pullParser =Xml.newPullParser();//也可以用该方法创建解析器
            pullParser.setInput(xml,"UTF-8");//设置Pull解析器要解析的数据
            //产生事件
            int event = pullParser.getEventType();
            //对事件进行判断
            while (event != XmlPullParser.END_DOCUMENT) {
                switch (event) {
                case XmlPullParser.START_DOCUMENT://文档开始
                    persons = new ArrayList<Person>();//存放解析数据数组的初始化
                    break;
                                                                                       
                case XmlPullParser.START_TAG:
                    if("person".equals(pullParser.getName())){
                        int id = new Integer(pullParser.getAttributeValue(0));
                        person = new Person();
                        person.setId(id);
                    }
                    if("name".equals(pullParser.getName())){
                        String name = pullParser.nextText();//得到后面的文本
                        person.setName(name);
                    }
                    if("age".equals(pullParser.getName())){
                        int age = new Integer(pullParser.nextText());//得到后面的文本
                        person.setAge(age);
                    }
                    break;
                case XmlPullParser.END_TAG:
                    if ("person".equals(pullParser.getName())) {
                        persons.add(person);
                        person = null;
                    }
                    break;
                }
             //解析完第一个字符,会停止解析,要让其继续,需要调用如下方法 
                event = pullParser.next();//进入到后面的节点,触发case XmlPullParser.START_TAG事件,利用循环解析
            } 
            return persons;
        }
    }

    通过以上步骤即可将XML文件中的数据解析出来,通过单元测试显示解析出来的数据

  5. 在AndroidManifest.xml文件中引入单元测试环境

    <uses-library android:name="android.test.runner" /> 
                             
    <instrumentation android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="cn.gaohao.xml" android:label="Test for my App" />


  6. 新建一个单元测试方法


public class PersonServiceTest extends AndroidTestCase {
    private static final String TAG = "PersonServiceTest";
    public void testPersons() throws Exception{
        InputStream xml = this.getClass().getClassLoader().getResourceAsStream("person.xml");
        List<Person> persons= PersonService.getPersons(xml);
        for (Person person : persons) {
            Log.i(TAG,person.toString());
        }
    }
}

执行该测试方法就会在LogCat控制台打印如下信息

03-28 06:13:45.375: INFO/PersonServiceTest(1247): Person [id=10,name=gaohao,age=25]
03-28 06:13:45.375: INFO/PersonServiceTest(1247): Person [id=11,name=gaofeng,age=31]

通过以上方法即可实现对XML文件中数据的解析。

(编辑:李大同)

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

    推荐文章
      热点阅读