android xml解析 XmlPullParser的使用
2013-09-24 21:49
471 查看
android xml解析 XmlPullParser的使用
android xml 的解析.
1.普通型
Xml代码
<?xml version=”1.0″ ?>
<statuses>
<status>
<source1>a</source1>
<source2>a</source2>
<source2>a</source2>
</status>
<statuses>
</xml>
解析代码.
Java代码
try{
xpp.setInput( new StringReader ( “xml string” ) );
XmlPullParser parser = XmlPullParserFactory.newInstance()
.newPullParser();
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
String name = parser.getName();
Log.v(“tag”,parser.getName()+”=”+parser.next());
}
eventType = parser.next();
}
} catch (XmlPullParserException e) {
} catch (Exception e) {
}
2.嵌套子类.
Xml代码
<?xml version=”1.0″ encoding=”UTF-8″ standalone=”no”?>
<statuses>
<status>
<source1>a</source1>
<source2>a</source2>
<source2>a</source2>
<user>
<source1>a</source1>
<source2>a</source2>
<source2>a</source2>
</user>
</status>
<status>
<source1>a</source1>
<source2>a</source2>
<source2>a</source2>
<user>
<source1>a</source1>
<source2>a</source2>
<source2>a</source2>
</user>
</status>
<statuses>
</xml>
解析代码:
Java代码
try{
XmlPullParser parser = XmlPullParserFactory.newInstance()
.newPullParser();
xpp.setInput( new StringReader ( xml string ) );
parser.next();
parser.require(XmlPullParser.START_TAG, null, “statuses”);
while (parser.nextTag() != XmlPullParser.END_TAG) {
parser.require(XmlPullParser.START_TAG, null, “status”);
for (int i=0;i<3;i++){
parser.nextTag();
Log.v(“tag”,parser.getName()+”=”+ parser.nextText());
}
while (parser.nextTag() != XmlPullParser.END_TAG) {
parser.require(XmlPullParser.START_TAG, null, “user”);
while (parser.nextTag() != XmlPullParser.END_TAG) {
String name = parser.getName();
String text2 = parser.nextText();
Log.v(“tag”,”text2″+text2);
parser.require(XmlPullParser.END_TAG, null, name);
}
parser.require(XmlPullParser.END_TAG, null, “user”);
}
parser.require(XmlPullParser.END_TAG, null, “status”);
}
parser.require(XmlPullParser.END_TAG, null, “statuses”);
parser.next();
parser.require(XmlPullParser.END_DOCUMENT, null, null);
// global.userinfo.dump();
} catch (XmlPullParserException e) {
} catch (Exception e) {
}
最里面那个可以满足 <user>也是循环. 如果<user>不循环.
可以使用.
Java代码
for (int i=0;i<3;i++){
parser.nextTag();
Log.v(“tag”,parser.getName()+”=”+ parser.nextText());
}
代替.
开发过程中遇到XmlPullParser.netText()方法造成的Bug
解决如下:
在Android上使用XmlPullParser是一中高效率和易维护解析XML的方法
。Android已经在历史上有两个实现这个接口实现类:
KXmlParser,通过XmlPullParserFactory.newPullParser() 。
ExpatPullParser,通过Xml.newPullParser() 。
实现
因此,一些应用可能会出现bug在额外调用next()或nextTag();
[html] view
plaincopy
throws XmlPullParserException, IOException {
XmlPullParser parser = Xml.newPullParser();
parser.setInput(reader);
parser.nextTag();
parser.require(XmlPullParser.START_TAG, null, "menu");
while (parser.nextTag() == XmlPullParser.START_TAG) {
parser.require(XmlPullParser.START_TAG, null, "item");
String itemText = parser.nextText();
parser.nextTag(); // this call shouldn’t be necessary!
parser.require(XmlPullParser.END_TAG, null, "item");
System.out.println("menu option: " + itemText);
}
parser.require(XmlPullParser.END_TAG, null, "menu");
}
public static void main(String[] args) throws Exception {
new Menu().parseXml(new StringReader("<?xml version='1.0'?>"
+ "<menu>"
+ " <item>Waffles</item>"
+ " <item>Coffee</item>"
+ "</menu>"));
}
在android4.0中,改变了Xml.newPullParser()返回KxmlParser类,同时删除了ExpatPullParser类。这样就修正了nextTag()的bug.
不幸的是,当前可能会崩溃的应用程序都是低于android4.0版本的,下面是错误信息。
[html] view
plaincopy
org.xmlpull.v1.XmlPullParserException: expected: END_TAG {null}item (position:START_TAG <item>@1:37 in java.io.StringReader@40442fa8)
at org.kxml2.io.KXmlParser.require(KXmlParser.java:2046)
at com.publicobject.waffles.Menu.parseXml(Menu.java:25)
at com.publicobject.waffles.Menu.main(Menu.java:32)
解决的办法是只有在调用nextText()之后再跳用nextTag(),仅当当前的位置不是END_TAG。
[html] view
plaincopy
while (parser.nextTag() == XmlPullParser.START_TAG) {
parser.require(XmlPullParser.START_TAG, null, "item");
String itemText = parser.nextText();
if (parser.getEventType() != XmlPullParser.END_TAG) {
parser.nextTag();
}
parser.require(XmlPullParser.END_TAG, null, "item");
System.out.println("menu option: " + itemText);
}
上面的代码可以正确解析所有xml版本,如果应用程序广范的使用了nextText(),那就在使用nextText()的地方用下面的辅助方法。
[html] view
plaincopy
private String safeNextText(XmlPullParser parser)
throws XmlPullParserException, IOException {
String result = parser.nextText();
if (parser.getEventType() != XmlPullParser.END_TAG) {
parser.nextTag();
}
return result;
}
使用单一的XmlPullParse简化了我们的维护,同时可以让我们有更多的精力花费在调高系统的性能。
android xml 的解析.
1.普通型
Xml代码
<?xml version=”1.0″ ?>
<statuses>
<status>
<source1>a</source1>
<source2>a</source2>
<source2>a</source2>
</status>
<statuses>
</xml>
解析代码.
Java代码
try{
xpp.setInput( new StringReader ( “xml string” ) );
XmlPullParser parser = XmlPullParserFactory.newInstance()
.newPullParser();
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
String name = parser.getName();
Log.v(“tag”,parser.getName()+”=”+parser.next());
}
eventType = parser.next();
}
} catch (XmlPullParserException e) {
} catch (Exception e) {
}
2.嵌套子类.
Xml代码
<?xml version=”1.0″ encoding=”UTF-8″ standalone=”no”?>
<statuses>
<status>
<source1>a</source1>
<source2>a</source2>
<source2>a</source2>
<user>
<source1>a</source1>
<source2>a</source2>
<source2>a</source2>
</user>
</status>
<status>
<source1>a</source1>
<source2>a</source2>
<source2>a</source2>
<user>
<source1>a</source1>
<source2>a</source2>
<source2>a</source2>
</user>
</status>
<statuses>
</xml>
解析代码:
Java代码
try{
XmlPullParser parser = XmlPullParserFactory.newInstance()
.newPullParser();
xpp.setInput( new StringReader ( xml string ) );
parser.next();
parser.require(XmlPullParser.START_TAG, null, “statuses”);
while (parser.nextTag() != XmlPullParser.END_TAG) {
parser.require(XmlPullParser.START_TAG, null, “status”);
for (int i=0;i<3;i++){
parser.nextTag();
Log.v(“tag”,parser.getName()+”=”+ parser.nextText());
}
while (parser.nextTag() != XmlPullParser.END_TAG) {
parser.require(XmlPullParser.START_TAG, null, “user”);
while (parser.nextTag() != XmlPullParser.END_TAG) {
String name = parser.getName();
String text2 = parser.nextText();
Log.v(“tag”,”text2″+text2);
parser.require(XmlPullParser.END_TAG, null, name);
}
parser.require(XmlPullParser.END_TAG, null, “user”);
}
parser.require(XmlPullParser.END_TAG, null, “status”);
}
parser.require(XmlPullParser.END_TAG, null, “statuses”);
parser.next();
parser.require(XmlPullParser.END_DOCUMENT, null, null);
// global.userinfo.dump();
} catch (XmlPullParserException e) {
} catch (Exception e) {
}
最里面那个可以满足 <user>也是循环. 如果<user>不循环.
可以使用.
Java代码
for (int i=0;i<3;i++){
parser.nextTag();
Log.v(“tag”,parser.getName()+”=”+ parser.nextText());
}
代替.
开发过程中遇到XmlPullParser.netText()方法造成的Bug
解决如下:
在Android上使用XmlPullParser是一中高效率和易维护解析XML的方法
。Android已经在历史上有两个实现这个接口实现类:
KXmlParser,通过XmlPullParserFactory.newPullParser() 。
ExpatPullParser,通过Xml.newPullParser() 。
实现
Xml.newPullParser()调用
nextText()有个错误,nextText()并不总是向文档中所提到优先于
END_TAG执行。
因此,一些应用可能会出现bug在额外调用next()或nextTag();
[html] view
plaincopy
throws XmlPullParserException, IOException {
XmlPullParser parser = Xml.newPullParser();
parser.setInput(reader);
parser.nextTag();
parser.require(XmlPullParser.START_TAG, null, "menu");
while (parser.nextTag() == XmlPullParser.START_TAG) {
parser.require(XmlPullParser.START_TAG, null, "item");
String itemText = parser.nextText();
parser.nextTag(); // this call shouldn’t be necessary!
parser.require(XmlPullParser.END_TAG, null, "item");
System.out.println("menu option: " + itemText);
}
parser.require(XmlPullParser.END_TAG, null, "menu");
}
public static void main(String[] args) throws Exception {
new Menu().parseXml(new StringReader("<?xml version='1.0'?>"
+ "<menu>"
+ " <item>Waffles</item>"
+ " <item>Coffee</item>"
+ "</menu>"));
}
在android4.0中,改变了Xml.newPullParser()返回KxmlParser类,同时删除了ExpatPullParser类。这样就修正了nextTag()的bug.
不幸的是,当前可能会崩溃的应用程序都是低于android4.0版本的,下面是错误信息。
[html] view
plaincopy
org.xmlpull.v1.XmlPullParserException: expected: END_TAG {null}item (position:START_TAG <item>@1:37 in java.io.StringReader@40442fa8)
at org.kxml2.io.KXmlParser.require(KXmlParser.java:2046)
at com.publicobject.waffles.Menu.parseXml(Menu.java:25)
at com.publicobject.waffles.Menu.main(Menu.java:32)
解决的办法是只有在调用nextText()之后再跳用nextTag(),仅当当前的位置不是END_TAG。
[html] view
plaincopy
while (parser.nextTag() == XmlPullParser.START_TAG) {
parser.require(XmlPullParser.START_TAG, null, "item");
String itemText = parser.nextText();
if (parser.getEventType() != XmlPullParser.END_TAG) {
parser.nextTag();
}
parser.require(XmlPullParser.END_TAG, null, "item");
System.out.println("menu option: " + itemText);
}
上面的代码可以正确解析所有xml版本,如果应用程序广范的使用了nextText(),那就在使用nextText()的地方用下面的辅助方法。
[html] view
plaincopy
private String safeNextText(XmlPullParser parser)
throws XmlPullParserException, IOException {
String result = parser.nextText();
if (parser.getEventType() != XmlPullParser.END_TAG) {
parser.nextTag();
}
return result;
}
使用单一的XmlPullParse简化了我们的维护,同时可以让我们有更多的精力花费在调高系统的性能。
相关文章推荐
- android退出整个应用程序
- android Installation error: INSTALL_FAILED_CONTAINER_ERROR
- 我的Android进阶之旅------>Android服务的生命周期回调方法
- 我的Android进阶之旅------>Android服务的生命周期回调方法
- Android中Service(服务)详解
- Android 内存优化
- Android开发 之 Android项目中如何正确的引入第三方jar包(工程)
- Android工程运行 ADB server didn't ACK * failed to start daemon *错误
- android adapter 深刻分析
- XML布局文件中 android:width与android:layout_width 的区别
- Pro Android学习笔记(三二):Menu(3):Context菜单
- Pro Android学习笔记(三一):Menu(2):扩展、图片、子菜单
- Android开发实践:屏幕旋转的处理
- Android开发实践:屏幕旋转的处理
- android SQLite数据库使用总结之(二)创建自己的数据库
- android SQLite数据库使用总结之(一)从加载本地数据库开始
- Android学习小应用案例---根据身高和性别计算标准体重
- Android笔记之ViewPager实现滑动页面
- 初识Android有感
- Android OpenGL库加载过程源码分析