除了可以使用SAX或DOM解析XML文件之外,在Android中可以使用Android内置的Pull解析器解析XML文件。 Pull解析器是一个开源的java项目,既可以用于android,也可以用于JavaEE。如果用在javaEE需要把其jar文件放入类路径中,因为Android已经集成进了Pull解析器,所以无需添加任何jar文件。android系统本身使用到的各种xml文件,其内部也是采用Pull解析器进行解析的。 Pull解析器的运行方式与SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值
Pull XML解析器早已经被google集成到Android sdk当中,它是google官方推荐的解析器。如果我们要在Java桌面、J2ME等当中使用Pull方式生成xml文件和
解析xml文件,需要用到kxml2;KXML解析器是基于普通XML PULL解析器的一个小巧的解析器,官网是http://kxml.org/,普通XML PULL解析器的官网是http://xmlpull.org/
XmlPull和Sax类似,是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序。因为是基于流的处理,因此Xmlpull和 Sax都比较节约内存资源,不会象Dom那样要把所有节点以对橡树的形式展现在内存中。 但Xmlpull比Sax更简明,而且不需要扫描完整个流。
具体示例:
(1)xml文件内容:在工程跟目录下建立xml/data1.xml文件,内容如下:
(2) 解析:
以上的代码在Java项目或Android项目中都可以使用。在Android中还提供了另一个类:XmlResourceParser,XmlResourceParser是XmlPullParser的子类,使用如下:(在Androiddemo中,xml文件存放在手机存储的根目录下:data1.xml)
demo传送门:
https://github.com/215836017/ParseXML_java
https://github.com/215836017/ParserXML_android
注:上面Java的demo中用到的xml文件是当前目录下的xml/data1.xml文件。result.xml是生成的文件。data2.xml, data3.xml是用来比较解析时间的。
Android的demo中用到xml文件是存放在手机根目录下的data1.xml文件。
Pull XML解析器早已经被google集成到Android sdk当中,它是google官方推荐的解析器。如果我们要在Java桌面、J2ME等当中使用Pull方式生成xml文件和
解析xml文件,需要用到kxml2;KXML解析器是基于普通XML PULL解析器的一个小巧的解析器,官网是http://kxml.org/,普通XML PULL解析器的官网是http://xmlpull.org/
XmlPull和Sax类似,是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序。因为是基于流的处理,因此Xmlpull和 Sax都比较节约内存资源,不会象Dom那样要把所有节点以对橡树的形式展现在内存中。 但Xmlpull比Sax更简明,而且不需要扫描完整个流。
具体示例:
(1)xml文件内容:在工程跟目录下建立xml/data1.xml文件,内容如下:
<students>
<student>
<name sex="man">小明</name>
<nickName>明明</nickName>
<age>20</age>
<address>北京</address>
</student>
<student>
<name sex="woman">小红</name>
<nickName>红红</nickName>
<age>20</age>
<address>上海</address>
</student>
<student>
<name sex="man">小亮</name>
<nickName>亮亮</nickName>
<age>30</age>
<address>广州</address>
</student>
<student-0>
<name sex="man">小亮-0</name>
<nickName>亮亮-0</nickName>
<age>200</age>
<address>广州-0</address>
</student-0>
</students>
(2) 解析:
private void parseXml() {
long startTime = System.currentTimeMillis();
System.out.println("开始解析:" + startTime);
Bean1 bean = null;
// XmlPullParser是android自带的,Java中默认不支持,因此需要下载kxml2.jar包
XmlPullParserFactory factory;
try {
factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser parser = factory.newPullParser();
// 初始化xmlPull解析器
parser.setInput(new FileInputStream(xmlFile), "utf-8");
int type = parser.getEventType();
// 无限判断文件类型进行读取
while (type != XmlPullParser.END_DOCUMENT) {
switch (type) {
case XmlPullParser.START_TAG:
if (parser.getName().equals("students")) {
datas = new ArrayList<>();
} else if (parser.getName().equals("student")) {
bean = new Bean1();
} else if (parser.getName().equals("name")) {
bean.setSex(parser.getAttributeValue(null, "sex"));
bean.setName(parser.nextText());
} else if (parser.getName().equals("address")) {
bean.setAddress(parser.nextText());
}else if(parser.getName().equals("age")){
bean.setAge(parser.nextText());
}else if (parser.getName().equals("nickName")) {
bean.setNickName(parser.nextText());
}
break;
case XmlPullParser.END_TAG:
if (parser.getName().equals("student")) {
datas.add(bean);
}
break;
default:
break;
}
type = parser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
long finishTime = System.currentTimeMillis();
long time = finishTime - startTime;
System.out.println("结束解析: " + finishTime + "\nPull解析耗时:" + time);
for(Bean1 student : datas){
System.out.println(student.toString());
}
}
以上的代码在Java项目或Android项目中都可以使用。在Android中还提供了另一个类:XmlResourceParser,XmlResourceParser是XmlPullParser的子类,使用如下:(在Androiddemo中,xml文件存放在手机存储的根目录下:data1.xml)
private void resPullParseXml() {
try {
Bean1 bean = null;
// XmlResourceParser是XMPullParser的子类
XmlResourceParser xrp = getResources().getXml(R.xml.data1);
while (xrp.getEventType() != XmlResourceParser.END_DOCUMENT) {
// 如果遇到开始标签
switch (xrp.getEventType()) {
case XmlResourceParser.START_TAG:
// 获取该标签的标签名
String tagName = xrp.getName();
if (tagName.equals("students")) {
// datas = new ArrayList<Bean1>();
} else if (tagName.equals("student")) {
bean = new Bean1();
} else if (tagName.equals("name")) {// 根据属性名来获取属性值
bean.setSex(xrp.getAttributeValue(null, "sex"));
bean.setName(xrp.nextText());
} else if (tagName.equals("nickName")) {
bean.setNickName(xrp.nextText());
} else if (tagName.equals("age")) {
bean.setAge(xrp.nextText());
} else if (tagName.equals("address")) {
bean.setAddress(xrp.nextText());
}
break;
case XmlResourceParser.END_TAG:
if (xrp.getName().equals("student")) {
datas.add(bean);
}
break;
}
xrp.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
demo传送门:
https://github.com/215836017/ParseXML_java
https://github.com/215836017/ParserXML_android
注:上面Java的demo中用到的xml文件是当前目录下的xml/data1.xml文件。result.xml是生成的文件。data2.xml, data3.xml是用来比较解析时间的。
Android的demo中用到xml文件是存放在手机根目录下的data1.xml文件。