您现在的位置:首页 >> Android开发 >> 内容

[Android进阶]解析XML文件之使用SAM解析器

时间:2014-6-6 16:32:02 点击:

  核心提示:XML是一种常见的数据传输方式,所以在开发中,我们会遇到对XML文件进行解析的时候,本篇主要介绍使用SAM解析器,对XML文件进行解析下面是我们要进行解析的文件格式?1234567891011!--?...

XML是一种常见的数据传输方式,所以在开发中,我们会遇到对XML文件进行解析的时候,本篇主要介绍使用SAM解析器,对XML文件进行解析

下面是我们要进行解析的文件格式

 

?
1
2
3
4
5
6
7
8
9
10
11
<!--?xml version="1.0" encoding="UTF-8"?-->
<persons>
    <person id="23">
        <name>liming</name>
        30</age>
    </person>
    <person id="20">
        <name>lixiangmei</name>
        25</age>
    </person>
</persons>

下面是我们的实体类

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class Person {
    private Integer id;
    private String name;
    private Short age;
     
    public Person(){}
     
    public Person(Integer id, String name, Short age) {
        this.id = id;
        this.name = name;
        this.age = 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 Short getAge() {
        return age;
    }
    public void setAge(Short age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person [age=" + age + ", id=" + id + ", name=" + name + "]";
    }
     
}

 

我们定义一个SAM解析器,对内容进行解析

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/**
 * 使用SAX对XML文件进行解析
 *
 * @author zhaokaiqiang
 *
 */
public class SaxResolve {
 
    public List<person> getPersons(InputStream inputStream) throws Exception {
 
        //获取SAXParser对象
        SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
        //实例化我们的解析器
        PersonHandler handler = new PersonHandler();
        //开始对输入流解析
        parser.parse(inputStream, handler);
        //关闭输入流
        inputStream.close();
        //返回结果
        return handler.getPersons();
    }
 
    private class PersonHandler extends DefaultHandler {
 
        private List<person> persons;
        private Person person = null;
        private String tag = null;
 
        public List<person> getPersons() {
            return persons;
        }
 
        // 当读取到xml文件的开始部分时,对persons进行初始化
        @Override
        public void startDocument() throws SAXException {
            persons = new ArrayList<person>();
        }
 
        // 这个方法对元素节点进行解析,如我们数据中的<person>、、<name>都属于元素节点
        // 当读取到person节点时,对Person对象进行初始化,同时获取到属性节点的值,并赋值给id,
        // 记录现在的节点的名称,即localName,用于Person节点内部节点的解析
        @Override
        public void startElement(String uri, String localName, String qName,
                Attributes attributes) throws SAXException {
            if (localName.equals("person")) {
                person = new Person();
                person.setId(new Integer(attributes.getValue(0)));
            }
            tag = localName;
        }
 
        // 这个回调方法用于对文本节点进行解析,如30</age>里面的30就是属于文本节点,
        // 我们根据元素节点tag的取值,取出里面的文本节点,然后对person进行赋值
        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException {
 
            if (tag != null) {
                String data = new String(ch, start, length);
                if ("name".equals(tag)) {
                    person.setName(data);
                } else if ("age".equals(tag)) {
                    person.setAge(new Short(data));
                }
            }
 
        }
 
        /*
         * 当到达一个元素节点的结束时 比如
         * <person id="20">
         *  <name>lixiangmei</name>
         *  25</age>
         * </person>
         * 当到达这里的</name></age></person>节点,就会出发下面的事件,我们在这个回调方法里面将解析出的person对象
         * 添加到persons里面,并且将person和tag进行初始化,进行下一个person节点的解析
         */
        @Override
        public void endElement(String uri, String localName, String qName)
                throws SAXException {
            if (localName.equals("person")) {
                persons.add(person);
                person = null;
            }
            tag = null;
        }
 
    }
 
}
</person></person></person></person>

因为注释比较详细,所以不过多解析,下面我们使用单元测试,对解析进行测试

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
//测试SAX解析
    public void testSax() throws Exception {
        //从xml文件中获取输入流
        InputStream inputStream = getClass().getClassLoader()
                .getResourceAsStream("persons.xml");
        //获取解析出的对象
        List<person> persons = new SaxResolve().getPersons(inputStream);
        //打印
        for (Person p : persons) {
            Log.d(TAG, p.toString());
        }
 
    }</person>

下面是解析结果

 

 

作者:不详 来源:网络
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 青春网络编程技术(www.qcfupo.com) © 2020 版权所有 All Rights Reserved.
  • Powered by qcfupo! V3.0sp1
  • 百度友情链接: 百家乐[www.chinawestnews.net/aomenbaijiale/] 赌博网[www.chinawestnews.net/amdbwz/] 海立方[www.bjl.gov.cn/bjgylc/] 娱乐城[www.gtxrmzf.gov.cn/mapai/] 娱乐城[www.hfsf.gov.cn/yfgj/] 威尼斯人[www.hllinkou.gov.cn/baijile/] 澳门威尼斯[www.jjwgj.gov.cn/wnsr/] 888真人[www.lagm.gov.cn/888zhenren/] 百乐坊[www.laoling.gov.cn/blfylc/] 现金网[www.longyu.gov.cn/xjw/] 百家乐[www.chinawestnews.net/ambjl/] 新葡京娱乐场[www.sjzedu.gov.cn/jsylc/] 时时彩[www.snjw.gov.cn/ssc/] 赌博[www.chinawestnews.net/aomendubo/]