2013-12-10 2 views
0

나는 API에서 나온 XML을 가지고 있는데, 표시 할 광고가 일부 포함되어 있습니다. 이 I에서XML 형식의 CDATA 태그를 사용하여 구문 분석

<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> 태그를 구문 분석하는 두 가지 : 여기 XML의 모습입니다. 두 태그 내부에 CDATA의 사례가 있습니다.

CDATA없이 언급 된 태그를 구문 분석하여 URL을 얻고 표시하려면 어떻게해야합니까? 모든 종류의 도움을 주시면 감사하겠습니다.

업데이트 코드 (사용 XMLPullParser)이 제공되고,

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; 
    } 
} 

을하지만 : 나는 XML의 값을 인쇄 할 경우

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; 
    } 
} 
} 

그리고 여기 내 비동기 작업입니다 피드 완전한 URL을 전달할 때마다 오류가 발생합니다. The constructor parserPull(String) is undefined

무엇이 잘못 되었나요? 오히려?

+0

파싱 코드를 추가 할 수 있습니까? –

+0

@Prince 코드로 질문을 업데이트했습니다. 벼룩이 보입니다. – Anupam

+0

@Anupam은 파싱 결과를 기록 할 수 있습니다. 나는 당신에게 workign 코드를 줄 수는 있지만 다른 사람들이 실수를 가리 키지 않을 것입니다. 구문 분석이 잘 작동합니까? – Raghunandan

답변

1

사용하십시오 XmlPullParser

The constructor parserPull(String) is undefined 

public AdPull(InputStream open)은의 InputStream을 기대하고있다. 생성자에 대한 잘못된 param이 있으며 이름도 잘못되었습니다.

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); 
    } 

} 

doInbackground에서

당신은 다음이 변경하게 AdPull에서

AdPull

readFeed(XmlPullParser parser)를 호출하지 않습니다 아래의 분리 된 .java 파일

public class Entry { 
    public final String adURL; 
    public final String adImage; 

    Entry(String url, String image) { 
     this.adURL = url; 
     this.adImage = image; 
    } 
} 

에있는

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; 
} 
+0

-1을주고 싶습니다! 죄송하지만 왜 OP의 코드에서 문제/오류를 표시하는 대신 전체 코드를 제공합니까? –

+0

@PareshMayani 네가 옳다. 미안 내 실수. – Raghunandan

+0

@PareshMayani 나는 op가 그의 코드를 변경하기를 기다렸고, 그 다음 문제를 근거로 대답했다. 잘못 본 것이 있으면 내 게시물을 편집하여 자유롭게 수정하도록하십시오. 감사합니다 귀하의 의견이 도움이됩니다. – Raghunandan

관련 문제