java XML解析

首先了解一下XML,XML是可扩展标记语言,看起来像下面这个样子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0"?>
2 <小纸条>
3  <收件人>大元</收件人>
4  <發件人>小張</發件人>
5  <主題>問候</主題>
6  <具體內容>早啊,飯吃了沒? </具體內容>
7 </小纸条>```
第一行为头部,展示了版本号和编码,为utf-8.
xml中标签是自己定义的,两个标签中的数据为数值。
在java中解析xml学习的是使用sax
使用sax解析可以分为5种事件,如下
                         i) 开始文档事件 startDocument()
                         ii) 开始标签事件 start Element()
                         iii) 文本事件  charachaers()
                         iv) 结束标签事件 endElement()
                         v) 结束文档事件endDocument()
大概流程就是在对应的解析函数中,自己操作数据,将数据取得,然后赋给实体类。下面一步一步的来完成这个过程。
首先第一步
创建一个sax解析工厂,这个工厂使用newInstance方法来得到,而不是创建出来的。
```java
SAXParserFactory factory = SAXParserFactory.newInstance();

第二步通过解析器的工厂来创建一个解析器

1
SAXParser parser = factory.newSAXParser();

然后我们可以通过解析器来解析xml文档,通过parser(String,handler)其中的String就是文件路径,不过也可以通过其他的方式,比如流等,文件都可以传入,问题在于后面的handler,这里我们需要自己写一个handler针对不同的需求,所以我们下一步来自定义一个Handler,我们继承DefaultHandler类,然后重写这里面,我们上面提到的5个方法:
整个代码如下:

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
public class MyHandler extends DefaultHandler{
 
     //结果的集合
     private List<Student> data = null ;
 
 
     //当前“组装” 的对象
     private Student student;
 
     private String tag; //记录当前解析的标签
 
 
 
 
     @Override
     public void startDocument() throws SAXException {
 
         //文档的开始
         //任务:  初始化集合
         data = new ArrayList<>(); // 该方法只会执行一次
     }
 
     @Override
     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
 
         //解析到“元素的开始” , 系统自动调用
 
         //String qName  :  标签的名字
         //Attributes attributes  :标签中的属性(属性名称 + 属性值)
 
         //任务1:  记录当前解析的标签是什么, 方便以后的方法使用:characters()
         tag = qName;
 
         //任务2: 如果是对象的根元素, 那么创建对象
         if ( "student" .equals(qName))
         {
             student = new Student();
         }
 
 
     }
 
     @Override
     public void characters( char [] ch, int start, int length) throws SAXException {
 
         String str = new String(ch, start, length).trim();
 
         if ( "id" .equals(tag)) {
 
             student.setId(Integer.parseInt(str));
         }
         else if ( "name" .equals(tag))
         {
             student.setName(str);
         }
         else if ( "age" .equals(tag))
         {
             student.setAge(Integer.parseInt(str));
         }
         else if ( "sex" .equals(tag))
         {
             student.setSex(str);
         }
     }
 
     @Override
     public void endElement(String uri, String localName, String qName) throws SAXException {
 
         //解析的元素的结束  qName,正在解析的标签名
         //任务1, 正在解析的标签如果是student 说明当前解析的对象已经组装完成了, 可以放入到集合中
         if ( "student" .equals(qName))
         {
             data.add(student);
         }
 
         tag = "" ;
 
     }
 
     @Override
     public void endDocument() throws SAXException {
         //文档结束
 
     }
 
     public List<Student> getList()
     {
         return data;
     }
}

这里解析的是一个student对象,之后在

1
2
3
4
5
6
7
parser.parse( "student.xml" , handler);
List<Student> data = handler.getList();
 
         for (Student student:data)
         {
             System.out.println(student);
         }

就能输出结果
另外,xml文件如下

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
<?xml version="1.0" encoding="UTF-8"?>
 
<students>
 
 
<student>
 
<id>1</id>
 
<name>zhangsan</name>
 
<age>20</age>
 
<sex>male</sex>
 
</student>
 
 
<student>
 
<id>2</id>
 
<name>lisi</name>
 
<age>21</age>
 
<sex>female</sex>
 
</student>
 
</students>

student类根据上面的属性写出,然后添加getset方法和toString方法即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值