解析方法:DOM、SAX、PULL
-
DOM:将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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
public
void
DOMParser() {
try
{
// 1.创建DocumentBuilder实例
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
// 2.创建Document实例
Document doc = builder.parse(file);
// 3.获取xml文件的根节点(persons)
Element element = doc.getDocumentElement();
// 4.获取根节点的子节点列表(person的列表)
NodeList personList = element.getElementsByTagName(
"person"
);
// TODO
// NodeList personList = element.getChildNodes();//这个方法不行
// 5. 遍历所有的person节点
for
(
int
i =
0
; i < personList.getLength(); i++) {
// 6.获取单个person节点
Element person = (Element) personList.item(i);
// 7.读取person的属性
String id = person.getAttribute(
"id"
);
System.out.println(
"person id: "
+ id);
// 8.获取person的子节点列表
NodeList childList = person.getChildNodes();
// 9.遍历person子节点
for
(
int
j =
0
; j < childList.getLength(); j++) {
// 10.访问子节点
Node child = (Node) childList.item(j);
if
(child.getNodeType() == Node.ELEMENT_NODE) {
// 如果子节点是一个元素节点
// 11.获取元素名称
String name = child.getNodeName();
if
(
"name"
.equals(name)) {
// 获取person name
System.out.println(
"名字: "
+ child.getFirstChild().getNodeValue());
}
else
if
(
"age"
.equals(name)) {
// 获取person age
System.out.println(
"年龄:"
+ child.getFirstChild().getNodeValue());
}
}
}
}
}
catch
(ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch
(SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch
(IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
|
2.SAX:从上往下挨个遍历标签
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
|
// 1.创建一个Handler类,继承DefaultHandler
class
SaxHandler
extends
DefaultHandler {
/** 上一个节点名称 */
private
String tag;
// 需要重写五个方法:
// 1.startDocument():开始文档时做预处理
// 2.endDocument():结束文档时做善后处理
// 3.startElement():遇到开始标签是调用该方法
// 4.endElement():遇到结束标签时调用该方法
// 5.characters():内容
public
void
startDocument()
throws
SAXException {
System.out.println(
"调用startDocument()方法"
);
}
public
void
endDocument()
throws
SAXException {
System.out.println(
"调用endDocument()方法"
);
}
// 在该方法中读取标签的属性
public
void
startElement(String uri, String localName, String qName,
Attributes attributes)
throws
SAXException {
System.out.println(
"调用startElement()方法"
+
"localName:"
+localName+
"qName:"
+qName);
if
(
"person"
.equals(qName)) {
System.out.println(
"person: "
);
System.out.println(
" id: "
+ attributes.getValue(
"id"
));
}
tag = qName;
}
public
void
endElement(String uri, String localName, String qName)
throws
SAXException {
System.out.println(
"调用endElement()方法"
);
}
// 读取标签内容
// 每次都开始结束标签时都调用
public
void
characters(
char
[] ch,
int
start,
int
length)
throws
SAXException {
System.out.println(
"调用characters()方法"
);
String data =
new
String(ch, start, length);
if
(
"name"
.equals(tag)) {
System.out.println(
"name: "
+ data);
}
else
if
(
"age"
.equals(tag)) {
System.out.println(
"age: "
+ data);
}
}
}
// 2.sax 解析
public
void
SAXParser() {
try
{
//2.1创建解析器
javax.xml.parsers.SAXParser parser = SAXParserFactory.newInstance()
.newSAXParser();
//2.2创建处理器
SaxHandler handler =
new
SaxHandler();
//2.3创建文件输入流
FileInputStream fis =
new
FileInputStream(file);
//2.4解析文件
parser.parse(file, handler);
}
catch
(FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch
(ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch
(SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch
(IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
|
3.Pull:与SAX类似,在android开发中应用较多
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
|
public
static
void
xmlPullParser(InputStream is) {
try
{
// 1.获取输入流
// 2.获取解析器
XmlPullParser parser = Xml.newPullParser();
parser.setInput(is,
"utf-8"
);
// 3.获取事件类型
int
eventType = parser.getEventType();
// 4.遍历节点
while
(eventType != XmlPullParser.END_DOCUMENT){
switch
(eventType) {
case
XmlPullParser.START_DOCUMENT:
//文件开启
break
;
case
XmlPullParser.START_TAG:
//标签开始
//4.1获取节点名称
String name = parser.getName();
if
(name.equals(
"person"
)){
//4.2 获取节点属性值
String id = parser.getAttributeValue(
0
);
}
else
if
(name.equals(
"name"
)){
//4.3 获取下个文本值
System.out.println(
"name: "
+ parser.nextText());
}
else
if
(name.equals(
"age"
)){
System.out.println(
"age: "
+ parser.nextText());
}
break
;
case
XmlPullParser.END_TAG:
//标签结束
break
;
default
:
break
;
}
eventType = parser.next();
}
is.close();
}
catch
(FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch
(XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch
(IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
|
本文转自wauoen51CTO博客,原文链接:http://blog.51cto.com/7183397/1606124 ,如需转载请自行联系原作者