【问题标题】:XML parsing with CDATA tag in it带有 CDATA 标记的 XML 解析
【发布时间】:2013-12-10 10:33:48
【问题描述】:

我有一个来自 API 的 XML,它包含一些要显示的广告。这是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>

在这我有两件事来解析&lt;url&gt; 标签和&lt;img&gt; 标签,以便在我的应用程序中正确显示它。在两个标签中都有CDATA 的情况。

如何在没有 CDATA 的情况下仅解析提到的标签以获取 url 并显示它。 任何形式的帮助将不胜感激。

更新代码(使用 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;
    }
}

但是,这给了我错误,每当我在其中传递完整的 URL The constructor parserPull(String) is undefined

我在这里做错了什么?

【问题讨论】:

标签: android xml xml-parsing xmlpullparser


【解决方案1】:

使用XmlPullParser

The constructor parserPull(String) is undefined 

public AdPull(InputStream open) 需要一个输入流。构造函数的参数错误,名称也错误。

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 我等待 op 更改他的代码,然后根据已回答的问题。如果您发现任何错误,请告诉我或随时编辑我的帖子以使其更好。感谢您的评论有帮助。
  • 不,现在答案看起来不错,在需要时使用 cmets 和细节。干杯:)
猜你喜欢
  • 2011-12-08
  • 2013-11-25
  • 2017-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
相关资源
最近更新 更多