android:xml的解析值XmlPullParser

来源:互联网 发布:js append html字符串 编辑:程序博客网 时间:2024/06/01 08:58
XmlPullParser,它是在Android上一个高效且可维护的解析XML方法。Android上有个接口的实现方式:
KXmlParser, 通XmlPullParserFactory.newPullParser())得到.
ExpatPullParser
, 通Xml.newPullParser())得到.
选择都是比好的。 下面的示例中是使用ExpatPullParser, 通Xml.newPullParser()得到.


step1:创建xml文件target.xml

<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.baidu.com">
    <entry>
        <id>http://stackoverflow.com</id>
        <title type="text">where is my data file</title>
    <category scheme="http://stackoverflow.com/feeds/tag?tagnames=android&amp;sort=newest/tags" term="file"></category>
<author>
<name>cliff2310</name>
<uri>http://stackoverflow.com/users/1128925</uri>
</author>
<link rel="alternate" href="http://stackoverflow.com/questions/&amp;9439999/where-is-my-data-file"/>
<published>2012-02-25T00:0:54Z</published>
<updated>2012-02-25T00:30:54Z</updated>
<summary type="html">
<p>have an Application that requires a data file</p>
</summary>
    </entry>
</feed>


step2:创建解析器

package com.example.xmlparser;


import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;


import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;


import android.util.Xml;


public class XmlParser {
private static String ns = null;

public List parse(InputStream in) throws XmlPullParserException,IOException{
try{
XmlPullParser parser = Xml.newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(in, null);
parser.nextTag();
return readFeed(parser);
}finally{
if(in != null)
in.close();
}
}

//解析feed节点
public List readFeed(XmlPullParser parser) throws XmlPullParserException,IOException{
ArrayList entrys = new ArrayList();
parser.require(XmlPullParser.START_TAG, ns, "feed");
while(parser.next() != XmlPullParser.END_TAG){
if(parser.getEventType() != XmlPullParser.START_TAG)
continue;
String name = parser.getName();

if(name.equals("entry"))
entrys.add(readEntry(parser));//解析entry节点
else
skip(parser);
}
return entrys;
}

//解析entry节点
public Entry readEntry(XmlPullParser parser) throws XmlPullParserException,IOException{
parser.require(XmlPullParser.START_TAG, ns, "entry");
String title = null;
String link = null;
String summary = null;
while(parser.next() != XmlPullParser.END_TAG){
if(parser.getEventType() != XmlPullParser.START_TAG)
continue;
String name = parser.getName();
if(name.equals("title"))
title = readTitle(parser);//解析title子节点
else if(name.equals("link"))
link = readLink(parser);//解析link子节点
else if(name.equals("summary"))
summary = readSummary(parser);//解析summary子节点
else
skip(parser); //跳过该节点
}
return new Entry(title,link,summary);
}

//解析summary子节点
private String readSummary(XmlPullParser parser) throws XmlPullParserException,IOException{
parser.require(XmlPullParser.START_TAG, ns, "summary");
String summary=null;
while(parser.next() != XmlPullParser.END_TAG){
if(parser.getEventType() != XmlPullParser.START_TAG)
continue;
String name = parser.getName();
if(name.equals("p")){
parser.require(XmlPullParser.START_TAG, ns, "p");
summary = readText(parser);
parser.require(XmlPullParser.END_TAG, ns, "p");
}
}
//parser.require(XmlPullParser.END_TAG, ns, "summary");
return summary;
}

//解析link子节点
private String readLink(XmlPullParser parser) throws XmlPullParserException,IOException{
parser.require(XmlPullParser.START_TAG, ns, "link");
String link = "";
String relType = parser.getAttributeValue(null, "rel");
if(relType.equals("alternate")){
link = parser.getAttributeValue(null, "href");
parser.nextTag();
}
parser.require(XmlPullParser.END_TAG, ns, "link");
return link;
}


//解析title子节点
private String readTitle(XmlPullParser parser) throws XmlPullParserException,IOException{
parser.require(XmlPullParser.START_TAG, ns, "title");
String title = readText(parser);
parser.require(XmlPullParser.END_TAG, ns, "title");
return title;
}

//读取文本节点数据
private String readText(XmlPullParser parser) throws XmlPullParserException,IOException{
String result = "";
if(parser.next() == XmlPullParser.TEXT)
{
result = parser.getText();
parser.nextTag();
}
return result;
}


//跳过节点
public void skip(XmlPullParser parser) throws XmlPullParserException,IOException{
if(parser.getEventType() != XmlPullParser.START_TAG)
throw new IllegalStateException();
int depath = 1;
while(depath != 0){
switch(parser.next()){
case XmlPullParser.START_TAG:
depath++;
break;
case XmlPullParser.END_TAG:
depath--;
break;
}
}
}
}


stp3:activity中获取target.xml对应的输入流

InputStream in = this.getClass().getClassLoader().getResourceAsStream("com/example/xmlparser/target.xml");

注意:此处注意url的路径写法,

可参照http://www.cnblogs.com/yejg1212/p/3270152.html


可能出现问题:

 假如内容中有<任意内容> 或是内容中有& 会报错误。

把其中的"&"转义字符&amp;代替,就OK了  (注意最后还有一个; 分号)

参照:http://blog.csdn.net/zgf1991/article/details/8540212


0 0