使用XmlPullParser对xml进行读取

使用XmlPullParser对xml进行读取

XML文件是一种标记性语言;在开发中经常在接口交互时被用作报文传输或者把自定义的类序列化为XML的形式存储到数据库。正因为XML文件这么常用,使用JAVA对XML文件进行读写操作是每一个开发人员必须掌握的技能点,下面总结一下个人用JAVA对XML文件的读写操作。

JAVA在XML解释器方面的包比较多,有基于DOM解释的DOM4j、推模式的SAX及拉模式的STAX。粗略介绍下这几种方式的特点,具体理论知识最好网上搜索一下进行了解。

* 1) 解释DOM : 每次都会把xml的具体内容加载到内存,操作速度比较快,不利于操作大的xml (J2EE常用) * 2) 推模式SAX : 解释能够比较快完成xml解析,占用内存比较小.但可控性相对不灵活 * 3) 拉模式STAX : 可控性比较高,操作灵活.(Andriod内置XMLPullParser)

因此个人查找了一下基于STAX模式的XmlPullParser进行学习,后面也会总结几篇对XmlPullParser的使用说明。首先先来使用XmlPullParser对Xml进行读取操作

说明: XmlPullParser(后面简写为xpp)为第三方开源的内容,使用时需要引入第三方的包 xpp3-1.1.4.C.jar

下载地址为: http://www.extreme.indiana.edu/dist/java-repository/xpp3/distributions/xpp3-1.1.4c_all.zip

代码功能说明:使用xpp对xml文件进行遍历,包括空的Text节点,及属性等内容

被读取的XML文件如下:

1

2

3

4 no

5 dangdang

6

http://www.dangdang.com

7

8

9

10 yes

11 dangdang

12

广州市中山三路

13

14

15 no

16 amazon

17

http//www.amazon.com

18

19

20 no

21 jingdong

22

http://www.jingdong.com

23

24

25 taobao

26

http://www.taobao.com

27 no

28

29

View Code

使用JAVA读取操作如下:

由于xpp上面的chm文件对应的API查找字段常量时比较麻烦,因此附上xpp定义节点常量字段说明

XmlPullParser 节点字段对应表格

类型

字段名称

public static final int

CDSECT

5

public static final int

COMMENT

9

public static final int

END_DOCUMENT

1

public static final int

START_DOCUMENT

0

public static final int

END_TAG

3

public static final int

START_TAG

2

public static final int

TEXT

4

1 package com.scl.j2se.xmlread.xxp;

2

3 import java.io.FileInputStream;

4

5 import org.xmlpull.v1.XmlPullParser;

6 import org.xmlpull.v1.XmlPullParserFactory;

7 /************************************************************************

8 * 版 本 号 : v1.0.0.0

9 * 作 者 : suncl

10 * 创建时间 : 2015年9月5日

11 * 更新时间 : 2015年9月5日

12 * 项目名称 : XPPTest.java

13 * 说 明 : 基于STAX的XML遍历方式

14 * 总 结 :

15 * 1. 使用拉模式比解析dom和推模式的优点

16 * 1) 解释DOM,每次都会把xml的具体内容加载到内存,操作速度比较快,不利于操作大的xml (J2EE常用)

17 * 2) 推模式SAX解释能够比较快完成xml解析,占用内存比较小.但可控性相对不灵活

18 * 3) 拉模式STAX可控性比较高,操作灵活.(Andriod内置XMLPullParser)

19 * 2. 使用XmlPullParser的步骤如下

20 * 1) 创建解析器工厂,通过工厂对象获取单个解析器 [跟Dom4j一样]

21 * 2) 通过setInput方法把解释文件通过流的形式传递给解释器,尽可能添加编码方式

22 * 3) 通过XmlPullParser的next方法对XMl进行循环读取

23 * 3. 使用 nextText()方法可能会导致抛异常,尽可能知道名称的情况下再使用该方法

24 ************************************************************************

25 * Copyright @ suncl 2013 . All rights reserved.

26 ************************************************************************/

27

28 public class XPPTest

29 {

30 //常量字符串

31 final static String STR_NODE_START_TAG = "<";

32 final static String STR_NODE_END = ">";

33 final static String STR_NODE_END_TAG_WITHVALUE_END = "

34

35 //final static String STR_NODE_END_TAG_WITHOUTVALUE_END = "/>";

36

37 public static void main(String[] args) throws Exception

38 {

39 //通过工厂模式获取xml解析器对象

40 XmlPullParserFactory xmlFactory = XmlPullParserFactory.newInstance();

41 XmlPullParser xmlParser = xmlFactory.newPullParser();

42 //把解释文件流及编码格式交给解释器

43 xmlParser.setInput(new FileInputStream("MyXml.xml"), "UTF-8");

44 int eventType = xmlParser.getEventType();

45 //使用XmlPullParser遍历xml

46 while ((eventType = xmlParser.getEventType()) != XmlPullParser.END_DOCUMENT)

47 {

48 //根据节点类型输出参数

49 if (eventType == XmlPullParser.START_TAG)

50 {

51 System.out.print(STR_NODE_START_TAG + xmlParser.getName());

52 //获取节点下的属性

53 int attrCount = xmlParser.getAttributeCount();

54 for (int i = 0; i < attrCount; i++)

55 {

56 String attrName = xmlParser.getAttributeName(i);

57 String attrValue = xmlParser.getAttributeValue(i);

58 System.out.print(" " + attrName + "=\"" + attrValue + "\"");

59 }

60 System.out.print(STR_NODE_END);

61 }

62 else if (eventType == XmlPullParser.TEXT)

63 {

64 // //判断文本是否为空

65 // if (xmlParser.isWhitespace())

66 // {

67 // System.out.println(true);

68 // }

69 System.out.print(xmlParser.getText());

70 }

71 else if (eventType == XmlPullParser.END_TAG)

72 {

73 System.out.print(STR_NODE_END_TAG_WITHVALUE_END + xmlParser.getName() + STR_NODE_END);

74 }

75

76 //XmlPullParser在底层实现了Iterator接口可通过next方法获取下一个xml节点

77 xmlParser.next();

78

79 //测试单节点的情况下是否会进入做开始和结束判断如,所以只做一次结束符判断即可

80 // if( eventType == XmlPullParser.START_TAG && xmlParser.getName().equals("ip"))

81 // {

82 // System.out.println("判断ip的开始元素开始执行");

83 // }

84 // else if (eventType == XmlPullParser.END_TAG && xmlParser.getName().equals("ip"))

85 // {

86 // System.out.println("判断ip的结束标签开始执行");

87 // }

88 // xmlParser.next();

89

90 //nextText()函数可能会导致出错,如

91 //抛异常:

92 // if ((eventType == XmlPullParser.START_TAG) && (xmlParser.getName().equals("bookshop")))

93 // {

94 // System.out.println(xmlParser.nextText());

95 // }

96 // xmlParser.next();

97 }

98

99 }

100 }

View Code

以上为使用XmlPullParse 实现STAX模式的XML文件读取。

补充: (1)XmlPullParse 解释器有一个不太好的地方,就是如果xml的格式类似:

1

流浪记

2

变形记

解释的时候,解释器会报错。以book作为一个根节点,不能在以book结束节点后面再添加一个相同的开始节点。必须添加一个另外名称的根节点才可以避开这种问题.

相关文章

上海青客租房网怎么样?租房子需要注意什么?
英国365bet网址

上海青客租房网怎么样?租房子需要注意什么?

📅 08-05 🔍 4318
孤影小号排位被天天封禁,无奈调侃自己是封号斗罗
口红行业消费现状及前景分析,口红逐渐成为越来越多女性的生活必需品「图」