2010-05-14 2 views
20

RSS 피드를 구문 분석하기 위해 자체 DefaultHandler를 만들었으며 대부분의 피드에서 ESPN의 경우 잘 작동하고 있기 때문에 방법으로 인해 기사 URL의 일부가 잘립니다. ESPN은 URL을 형식화합니다. ESPN에서 전체 기사 URL의 예 ..Android SAX 파서가 태그 사이에서 전체 텍스트를 가져 오지 않음

http://sports.espn.go.com/nba/news/story?id=5189101&campaign=rss&source=ESPNHeadlines 

문제는 DefaultHandler를 문자 방법은 위의 URL을 포함하는 태그에서이 점점 몇 가지 이유입니다.

http://sports.espn.go.com/nba/news/story?id=5189101 

위와 같이 앰퍼샌드 이스케이프 코드 이후의 모든 내용이 URL에서 삭제됩니다. 이 이스케이프 코드에서 문자열을 잘라 내지 않도록 SAX 파서를 어떻게 얻을 수 있습니까? 심판을 위해. 여기 내 문자 방법 .. 당신이 볼 수 있듯이, 그것은 앰퍼샌드 이스케이프 코드에서와 후 URL 오프 모든 절단 것

public void characters(char ch[], int start, int length) { 

    String chars = (new String(ch).substring(start, start + length)); 

    try { 
    // If not in item, then title/link refers to feed 
    if (!inItem) { 
    if (inTitle) 
    currentFeed.title = chars; 
    } else { 
    if (inLink) 
    currentArticle.url = new URL(chars); 
    if (inTitle) 
    currentArticle.title = chars; 
    if (inDescription) 
    currentArticle.description = chars; 
    if (inPubDate) 
    currentArticle.pubDate = chars; 
    if (inEnclosure) { 
    } 
    } 
    } catch (MalformedURLException e) { 
    Log.e("RSSReader", e.toString()); 
    } 
} 

롭 W.

답변

45

이다. characters() 방법의 documentation에서

:

파서는 보고서 문자 데이터의 각 청크에이 메소드를 호출합니다. SAX 파서는 연속 된 모든 문자 데이터를 단일 청크로 반환하거나 여러 청크로 분할 할 수 있습니다. 그러나 단일 이벤트의 모든 문자는 동일한 외부 엔터티에서 가져와야하므로 로케이터 이 유용한 정보를 제공합니다.

public void characters (char ch[], int start, int length) { 
    if (buf!=null) { 
     for (int i=start; i<start+length; i++) { 
      buf.append(ch[i]); 
     } 
    } 
} 

그런 다음 endElement()에, 나는 StringBuilder의 내용을 그것으로 뭔가를 할 :

내가 SAX 파서를 쓰기

, 나는 characters()에 전달 된 모든 추가하는 StringBuilder를 사용합니다. 그런 식으로 파서가 characters() 번을 여러 번 호출하면 나는 아무것도 놓치지 않는다.

+0

좋아, 나는 파서가 어떻게 작동하는지 완전히 이해하는 데 시간이 걸리지 않았다. 당신의 대답을 읽은 후에 나는 더 깊이 이해하고 더 깊이 연구했습니다. 귀하의 제안은 당연히 문제 였고, 이후 char 데이터를 올바르게 처리하도록 코드를 업데이트했습니다. TY – brockoli

+0

@CommonsWare : 일부 문자가 누락 되었습니까? 나는 내 경우에 그것을 직면하고있다. – Ankit

+0

나는 image1 : 내 내 xml에 있고 때로는 전체 가치를 얻으며 때로는 "itle"또는 "Title"만 얻습니다. 값을 인쇄하려했지만 부분 값의 경우 "image1 :"을 인쇄하지 않았습니다. – Ankit

5
@Override 
public void startElement(String uri, String localName, String qName, 
     Attributes attributes) throws SAXException { 
    // TODO Auto-generated method stub 
    sb=new StringBuilder(); 
    if(localName.equals("icon")) 
    { 
     iconflag=true; 
    } 
} 

@Override 
public void characters (char ch[], int start, int length) { 
    if (sb!=null && iconflag == true) { 
     for (int i=start; i<start+length; i++) { 
      sb.append(ch[i]); 
     } 
    } 
} 

@Override 
public void endElement(String uri, String localName, String qName) 
     throws SAXException { 
    // TODO Auto-generated method stub 
    if(iconflag) 
    { 
     info.setIcon(sb.toString().trim()); 
     iconflag=false; 
    } 
} 

위의 코드는 해결책입니다.

+0

나는 위의 대답에서 몇 가지 포인터를 취했습니다. – anonymous123

관련 문제