I'm trying to parse a XML
which is a thirdparty response when I call certain API. Here is the response of the XML
:
<mojiva>
<ad type="thirdparty" feed="xyz">
<url>
<![CDATA[ ]]>
</url>
<text>
<![CDATA[ ]]>
</text>
<track>
<![CDATA[ ]]>
</track>
<content>
<script> // Original sdk: "http://lp.mydas.mobi/custom/rich/common/js/mmisdk/mmsdk.min.js" </script>
</content>
</ad>
</mojiva>
I'm trying to parse <content>
tag, but I'm getting the following exception:
12-16 06:40:55.148: W/System.err(4089): org.xmlpull.v1.XmlPullParserException: expected: START_TAG {null}content (position:START_TAG <text>@1:116 in java.io.InputStreamReader@a6a613e0)
12-16 06:40:55.148: W/System.err(4089): at org.kxml2.io.KXmlParser.require(KXmlParser.java:2046)
Updated Code:
I'm parsing the XML
using XmlPullParser
. Here is what my code looks like:
public class 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 = (ArrayList<Entry>) readFeed(parser);
for (int i = 0; i < all.size(); i++) {
Log.i("........", "" + all.get(i).url);
Log.i("........", "" + all.get(i).text);
Log.i("........", "" + all.get(i).track);
Log.i("........", "" + all.get(i).thirdPartyContent);
}
} catch (Exception e) {
e.printStackTrace();
}
return all;
}
private List<Entry> readFeed(XmlPullParser parser)
throws XmlPullParserException, IOException {
List<Entry> entries = new ArrayList<Entry>();
parser.require(XmlPullParser.START_TAG, ns, "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, ns, "ad");
String url = null;
String text = null;
String track = null;
String content = null;
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String name = parser.getName();
Log.i("...............", name);
if (name.equals("url")) {
url = readUrl(parser);
} else if (name.equals("text")) {
text = readTexta(parser);
} else if (name.equals("track")) {
track = readTrack(parser);
} else if (name.equals("content")) {
content = readContent(parser);
} else {
skip(parser);
}
}
return new Entry(url, text, track, content);
}
private String readContent(XmlPullParser parser) throws IOException,
XmlPullParserException {
parser.require(XmlPullParser.START_TAG, ns, "content");
String content = null;
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String name = parser.getName();
if (name.equals("script")) {
content = readScript(parser);
Log.i(".......", content);
} else {
skip(parser);
}
}
return content;
}
private String readScript(XmlPullParser parser) throws IOException,
XmlPullParserException {
parser.require(XmlPullParser.START_TAG, ns, "script");
String script = readText(parser);
parser.require(XmlPullParser.END_TAG, ns, "script");
return script;
}
private String readUrl(XmlPullParser parser) throws IOException,
XmlPullParserException {
parser.require(XmlPullParser.START_TAG, ns, "url");
String url = readText(parser);
parser.require(XmlPullParser.END_TAG, ns, "url");
return url;
}
private String readTexta(XmlPullParser parser) throws IOException,
XmlPullParserException {
parser.require(XmlPullParser.START_TAG, ns, "text");
String text = readText(parser);
parser.require(XmlPullParser.END_TAG, ns, "text");
return text;
}
private String readTrack(XmlPullParser parser) throws IOException,
XmlPullParserException {
parser.require(XmlPullParser.START_TAG, ns, "track");
String track = readText(parser);
parser.require(XmlPullParser.END_TAG, ns, "track");
return track;
}
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;
}
}
}
}
I'm calling getData() from my MainActivity in async task:
class AsyncTaskRunner extends AsyncTask<Void, List<Entry>, List<Entry>> {
@Override
protected List<Entry> doInBackground(Void... sUrl) {
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());
AdPull ad = new AdPull(is); // expects a input stream
List<Entry> list = ad.getData();
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
Under tag content you have tag script. So you need to parse script tag also
Example :
I added dummy values for testing. I put the xml in assests folder and i parsed the xml as below
And parsing
Then
Log