Pytanie Parser SAX Androida nie uzyskuje pełnego tekstu między tagami


Stworzyłem swój DefaultHandler, aby analizować rss, a dla większości kanałów działa dobrze, jednak w przypadku ESPN odcina część adresu URL artykułu ze względu na sposób, w jaki ESPN formatuje jego adresy URL. Przykład pełnego adresu URL artykułu z ESPN ..

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

Problem z jakiegoś powodu polega na tym, że metoda znaków DefaultHandler pobiera to tylko ze znacznika zawierającego powyższy adres URL.

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

Jak widać, odcina to wszystko od adresu URL od kodu eskperującego i po nim. W jaki sposób można uzyskać, aby analizator składni SAX nie odcinał ciągu znaków przy tym kodzie wyjścia? Dla ref. tutaj jest moja metoda znaków ...

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

Rob W.


20
2018-05-14 22:44


pochodzenie




Odpowiedzi:


Jak widać, to cięcie   wszystko poza adresem URL   Kod ucieczki i ampersand po.

Od dokumentacja z characters() metoda:

Analizator składni wywoła tę metodę   zgłoś każdy fragment danych postaci.   Analizatory składni SAX mogą zwracać wszystkie sąsiadujące   dane znakowe w pojedynczej porcji, lub   mogą podzielić go na kilka części;   jednak wszystkie postacie w każdym   pojedyncze zdarzenie musi pochodzić z tego samego   zewnętrzny podmiot, aby Lokalizator   dostarcza użytecznych informacji.

Kiedy piszę parsery SAX, używam a StringBuilder dołączać wszystko, co zostało przekazane characters():

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

Następnie w endElement(), Biorę zawartość StringBuilder i zrób coś z tym. W ten sposób, jeśli parser wywoła characters() kilka razy, nie brakuje mi niczego.


45
2018-05-14 23:56



Ok, nie poświęciłem czasu, aby w pełni zrozumieć działanie parsera. Po przeczytaniu odpowiedzi wróciłem i zacząłem dalej badać, aby uzyskać lepsze zrozumienie. Twoja sugestia była oczywiście problemem, odkąd zaktualizowałem swój kod, aby poprawnie obsługiwać dane char. TY - brockoli
@CommonsWare: czy brakuje niektórych znaków? Stoję w obliczu tego w moim przypadku. - Ankit
Mam <image> image1: title </ image> w moim xml i czasami mam pełną wartość, a czasami mam tylko "itle" lub "Title". Próbowałem drukować wartości, ale nigdy nie drukowałem "image1:" dla wartości częściowych. - Ankit
@Ankit: Otwórz nowe pytanie dotyczące StackOverflow, pokaż dane wejściowe, kod parsujący i wyniki. - CommonsWare
@ KK_07k11A0585: To jest oddzielny element XML. Otrzymujesz go już podczas analizy, w swoim startElement() i endElement() metody. - CommonsWare


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

Więc wymyśliłem to, powyższy kod jest rozwiązaniem.


5
2018-05-29 12:34



Z powyższej odpowiedzi wyciągnąłem kilka wskazówek. - anonymous123