使用CDATA标记进行XML解析
我有一个来自API的XML
,它包含一些要显示的广告。下面是XML
样子:使用CDATA标记进行XML解析
<mojiva>
<ad type="image">
<url>
<![CDATA[
http://google.com
]]>
</url>
<img type="image/png">
<![CDATA[
http://account.mobfox.com/activation_vad.php
]]>
</img>
<track>
<![CDATA[
http://ads.moceanads.com/2/img/c2d79d40-6182-11e3-8f06-a0369f167751
]]>
</track>
</ad>
</mojiva>
在此我两件事情来解析<url>
标签和标签<img>
用于显示得当我的应用程序中。两个标签内都有一个CDATA
的情况。
如何解析只提到的标签没有CDATA
获取网址并显示它。 任何形式的帮助将不胜感激。
更新后的代码(使用XMLPullParser):
public class AdPull {
private static final String demoURL = null;
public AdPull(InputStream open) {
try {
XmlPullParser parser = Xml.newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(open, null);
parser.nextTag();
} catch (Exception e) {
e.printStackTrace();
}
}
private List<Entry> readFeed(XmlPullParser parser)
throws XmlPullParserException, IOException {
List<Entry> entries = new ArrayList<Entry>();
parser.require(XmlPullParser.START_TAG, demoURL, "mojiva");
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String name = parser.getName();
if (name.equals("ad")) {
entries.add(readAd(parser));
} else {
skip(parser);
}
}
return entries;
}
private Entry readAd(XmlPullParser parser) throws XmlPullParserException,
IOException {
parser.require(XmlPullParser.START_TAG, demoURL, "ad");
String url = null;
String image = null;
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String name = parser.getName();
if (name.equals("url")) {
url = readUrl(parser);
} else if (name.equals("img")) {
image = readImage(parser);
} else {
skip(parser);
}
}
return new Entry(url, image);
}
private String readUrl(XmlPullParser parser) throws IOException,
XmlPullParserException {
parser.require(XmlPullParser.START_TAG, demoURL, "url");
String url = readText(parser);
parser.require(XmlPullParser.END_TAG, demoURL, "url");
return url;
}
private String readImage(XmlPullParser parser) throws IOException,
XmlPullParserException {
parser.require(XmlPullParser.START_TAG, demoURL, "img");
String image = readText(parser);
parser.require(XmlPullParser.END_TAG, demoURL, "img");
return image;
}
private String readText(XmlPullParser parser) throws IOException,
XmlPullParserException {
String result = "";
if (parser.next() == XmlPullParser.TEXT) {
result = parser.getText();
parser.nextTag();
}
return result;
}
private void skip(XmlPullParser parser) throws XmlPullParserException,
IOException {
if (parser.getEventType() != XmlPullParser.START_TAG) {
throw new IllegalStateException();
}
int depth = 1;
while (depth != 0) {
switch (parser.next()) {
case XmlPullParser.END_TAG:
depth--;
break;
case XmlPullParser.START_TAG:
depth++;
break;
}
}
}
public static class Entry {
public final String adURL;
public final String adImage;
private Entry(String url, String image) {
this.adURL = url;
this.adImage = image;
}
}
}
这里是我的异步任务,我想打印XML
值提要:
class AsyncTaskRunner extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... params) {
try {
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpGet httppost = new HttpGet(completeURL);
HttpResponse response = httpclient.execute(httppost);
HttpEntity ht = response.getEntity();
String _respons = EntityUtils.toString(ht);
InputStream is = new ByteArrayInputStream(_respons.getBytes());
new AdPull(is);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
但是,这是给我错误,只要我通过它里面的completeURL The constructor parserPull(String) is undefined
我在做什么错h ERE?
使用XmlPullParser
The constructor parserPull(String) is undefined
public AdPull(InputStream open)
预计为InputStream。你有错误的构造函数参数,名字也是错误的。
在doInbackground
class AsyncTaskRunnerextends AsyncTask<Void ,List<Entry>,List<Entry>>{
@Override
protected List<Entry> doInBackground(Void... sUrl) {
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpGet httppost = new HttpGet(completeURL);
HttpResponse response = httpclient.execute(httppost);
HttpEntity ht = response.getEntity();
String _respons = EntityUtils.toString(ht);
InputStream is = new ByteArrayInputStream(_respons.getBytes());
AdPull ad =new AdPull(is); //expects a input stream
List<Entry> list = ad.getData();
return list;
}
@Override
protected void onPostExecute(List<Entry> result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
}
}
有以下单独的java文件
public class Entry {
public final String adURL;
public final String adImage;
Entry(String url, String image) {
this.adURL = url;
this.adImage = image;
}
}
你不AdPull
调用readFeed(XmlPullParser parser)
在AdPull
做如下修改
private static final String ns = null;
List<Entry> all;
InputStream is;
public AdPull(InputStream open) {
is =open;
}
public List<Entry> getData()
{
try
{
XmlPullParser parser = Xml.newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(is, null);
parser.nextTag();
all = readFeed(parser);
}catch(Exception e)
{
e.printStackTrace();
}
return all;
}
我想给-1!对不起,为什么你总是提供完整的代码,而不是显示OP代码中的问题/错误? –
@PareshMayani是的,你是对的。对不起这是我的错。 – Raghunandan
@PareshMayani我等待改变他的代码,然后根据问题回答。如果您发现任何错误,请让我知道或随意修改我的帖子以使其更好。感谢您的评论帮助。 – Raghunandan
你可以添加你的解析代码吗? –
@Pince用代码更新了问题。请认真看看。 – Anupam
@Anupam你可以记录你的解析结果。我可以给你一个工作代码,但这不会帮助别人,因为我不会指出错误。你的解析工作正常吗? – Raghunandan