我是靠谱客的博主 坚强台灯,这篇文章主要介绍详细介绍Xml数据解析的三种方式的示例代码,现在分享给大家,希望可以做个参考。

一概述

xml作为一种数据交互格式,涉及到xml数据的生成与解析,这里将讲述Xml解析的三种方式。

二、Dom解析

1、创建解析器工厂对象(DocumentBuilderFactory对象)

2、创建解析器对象(DocumentBuilder)

3、创建Document对象

例如解析下述文件

复制代码
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
<?xml version="1.0" encoding="utf-8"?> <students> <student id = "1001"> <id>1</id> <name>杨威</name> <address>大连</address> <age>21</age> </student> <student id = "1002"> <id>2</id> <name>劉海洋</name> <address>深圳</address> <age>23</age> </student> <student id = "1003"> <id>3</id> <name>王小波</name> <address>廣州</address> <age>22</age> </student> </students>
登录后复制

解析代码如下

复制代码
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
[code]package com.kuxiao.train.xml; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; public class XmlParseTest { public static void main(String[] args) throws Exception { //xml doc解析步骤 //1、获取解析工厂对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); //2、构建解析器对象 DocumentBuilder db = dbf.newDocumentBuilder(); //3、构建docment对象 Document doc = db.parse(new File("person.xml")); Element ele = doc.getDocumentElement(); //实现解析逻辑 NodeList list = doc.getElementsByTagName("student"); for(int i = 0; i < list.getLength();i++) { Element element = (Element) list.item(i); String attrid = element.getAttribute("id"); System.out.println("attrid = " + attrid); Element element1 = (Element) element.getElementsByTagName("id").item(0); String id = element1.getFirstChild().getNodeValue(); System.out.println(id); element1 = (Element) element.getElementsByTagName("name").item(0); String name = element1.getFirstChild().getNodeValue(); System.out.println(name); element1 = (Element) element.getElementsByTagName("address").item(0); String address = element1.getFirstChild().getNodeValue(); System.out.println(address); } } }
登录后复制

三、注意事项

1、Element ele = doc.getDocumentElement(); 获取根元素

2、获取到元素时,元素的值也是节点,必须element.getFirstChild().getNodeValue()方法取值。

3、xml中的空白也是Node,text类型的。

四、SAX解析

1、创建SAXParserFactory对象

2、创建SAXparser对象

3、创建MyHandler继承DefaultHandler类,重写方法。

4、sp.parse(new File(“student.xml”), new MyHandler(list));

复制代码
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
[code]package com.kuxiao.train.xml.sax; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Stack; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class TestSax { public static void main(String[] args) throws Exception { SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); List<Student> list = new ArrayList<>(); sp.parse(new File("student.xml"), new MyHandler(list)); System.out.println(list); } } class MyHandler extends DefaultHandler { private Stack<String> stack = new Stack<>(); private Student student; private List<Student> mList = null; public MyHandler(List<Student> list) { this.mList = list; } @Override public void startDocument() throws SAXException { System.out.println("解析文档开始了..."); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if(qName.equals("学生")) { student = new Student(); if(attributes.getLength() != 0) { for(int i = 0; i < attributes.getLength();i++) { String id = attributes.getValue(i); student.setId(Integer.parseInt(id)); } } } /*if(qName.equals("姓名")) { stack.push(qName); } if(qName.equals("年龄")) { stack.push(qName); } if(qName.equals("性别")) { stack.push(qName); }*/ stack.push(qName); } @Override public void characters(char[] ch, int start, int length) throws SAXException { String qName = stack.peek(); if(qName.equals("性别")){ student.setGender(new String(ch,start,length)); } if(qName.equals("姓名")){ student.setName(new String(ch,start,length)); } if(qName.equals("年龄")){ student.setAge(new String(ch,start,length)); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { stack.pop(); if(qName.equals("学生")) { mList.add(student); student = null; } } @Override public void endDocument() throws SAXException { System.out.println("解析文档结束了....."); } }
登录后复制

SAX是基于事件模型的,顺序解析的,内部实现是观察者模式,优势在于占用内存少,效率高,缺点在编码相对比较复杂。

五、Pull解析

1、此解析方式不是JDK自带的,需要导入第三方库

2、创建XmlPullParserFactory对象

3、创建XmlPullParser对象

4、调用xpp.setInput(is,”utf-8”)

5、对应事件类型处理 xpp.next()下一个事件类型

复制代码
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
[code]package com.kuxiao.train.xml.pull; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserFactory; public class PullTest { public static void main(String[] args) throws Exception { FileInputStream is = new FileInputStream(new File("person.xml")); long time = System.currentTimeMillis(); List<Student> list = new ArrayList<>(); XmlPullParserFactory xppf = XmlPullParserFactory.newInstance(); XmlPullParser xpp = xppf.newPullParser(); xpp.setInput(is, "utf-8"); Student student = null; int eventType = xpp.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_TAG: if (xpp.getName().equals("student")) { student = new Student(); String id = xpp.getAttributeValue(0); student.setId(id); } else if (xpp.getName().equals("name")) { student.setName(xpp.nextText()); } else if (xpp.getName().equals("address")) { student.setAddress(xpp.nextText()); } else if (xpp.getName().equals("age")) { student.setAge(xpp.nextText()); } break; case XmlPullParser.START_DOCUMENT: System.out.println("开始了...."); break; case XmlPullParser.END_TAG: if (xpp.getName().equals("student")) { list.add(student); student = null; } break; } eventType = xpp.next(); } is.close(); long time1 = System.currentTimeMillis(); System.out.println(time1 - time); for (Student student2 : list) { System.out.println(student2); } FileInputStream fis = new FileInputStream(new File("person.xml")); List<Student> list1 = getListBean(fis, new String[] { "id", "name", "address", "age", "gender" }, Student.class, 0); for (Student student2 : list1) { System.out.println(student2); } } //封装的全能解析xml文件的方法 //参数说明 //attrs是文件里bean对象的元素与属性名 //clazz是Bean对象的class对象 //j代表属性的个数 public static <T> List<T> getListBean(InputStream is, String[] attrs, Class<T> clazz, int j) throws Exception { long time = System.currentTimeMillis(); T c = null; XmlPullParserFactory xppf = XmlPullParserFactory.newInstance(); XmlPullParser xpp = xppf.newPullParser(); xpp.setInput(is, "utf-8"); List<T> list = null; int eventType = xpp.getEventType(); String classname = ""; while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_TAG: int bigen = clazz.getName().lastIndexOf(".") + 1; classname = clazz.getName().substring(bigen); classname = classname.substring(0, 1).toLowerCase() + classname.substring(1); String elementName = xpp.getName(); if (classname.equals(elementName)) { c = clazz.newInstance(); if (xpp.getAttributeCount() != 0) { for (int i = 0; i < j; i++) { String attrName = xpp.getAttributeName(i); for (String field : attrs) { if (field.equals(attrName)) { String frist = field.substring(0, 1) .toUpperCase(); Method method = clazz.getDeclaredMethod( "set" + frist + field.substring(1), new Class[] { String.class }); method.setAccessible(true); method.invoke(c, xpp.getAttributeValue(i)); } } } } } else { for (String field : attrs) { if (field.equals(elementName)) { String frist = field.substring(0, 1).toUpperCase(); Method method = clazz.getDeclaredMethod("set" + frist + field.substring(1), new Class[] { String.class }); method.setAccessible(true); method.invoke(c, xpp.nextText()); } } } break; case XmlPullParser.START_DOCUMENT: list = new ArrayList<T>(); break; case XmlPullParser.END_TAG: if (!classname.equals("") && classname.equals(xpp.getName())) { list.add(c); c = null; } break; } eventType = xpp.next(); } is.close(); long time1 = System.currentTimeMillis(); System.out.println(time1 - time); return list; } }
登录后复制

以上就是详细介绍Xml数据解析的三种方式的示例代码的详细内容,更多请关注靠谱客其它相关文章!

最后

以上就是坚强台灯最近收集整理的关于详细介绍Xml数据解析的三种方式的示例代码的全部内容,更多相关详细介绍Xml数据解析内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(99)

评论列表共有 0 条评论

立即
投稿
返回
顶部