2010-02-15 16 views
7

J'écris une petite application de capture d'écran qui consomme du XHTML - il va sans dire que le XHTML n'est pas valide: les esperluettes ne sont pas échappées comme &.Parser les esperluettes invalides avec XmlPullParsers d'Android

J'utilise Android de XmlPullParser et il vomit l'erreur suivante sur la valeur codée de manière incorrecte:

org.xmlpull.v1.XmlPullParserException: unterminated entity ref 
(position:START_TAG <a href='/Fahrinfo/bin/query.bin/dox?ld=0.1&n=3&i=9c.0323581.1266265347&rt=0&vcra'> 
@55:134 in [email protected]) 

Comment puis-je contourner cela? J'ai pensé les solutions suivantes:

  1. Emballage du InputStream dans une autre qui remplace l'esperluette avec refs entité
  2. Configuration du Parser il accepte comme par magie le balisage incorrect

Lesquelles est probable avoir plus de succès?

+1

Merci d'avoir posté cette question. J'éprouvais une "entité REF non terminée" sur du code XML que j'essayais d'analyser avec XmlPullParser, mais je n'étais pas sûr de ce qui le provoquait. Mais maintenant que vous mentionnez des esperluettes non-échappées (provoquant un XML invalide que firefox ne montrera pas sauf en mode source) comme une cause possible, je suis à peu près sûr que c'est mon problème, ce qui le rendra beaucoup plus facile à corriger! –

Répondre

2

Je voudrais aller avec votre première option, le remplacement des esperluettes semble plus d'une solution en forme que l'autre. La deuxième option semble plus d'un hack pour le faire fonctionner en acceptant le balisage incorrect.

6

J'ai été bloqué sur cela pendant environ une heure avant de comprendre que dans mon cas c'était le "&" qui n'a pas pu être résolu par le XML PULL PARSER, donc j'ai trouvé la solution. Voici donc un extrait de code qui le corrige totalement. jolie

void ParsingActivity(String r) { 
    try { 
     parserCreator = XmlPullParserFactory.newInstance(); 
     parser = parserCreator.newPullParser(); 
     // Here we give our file object in the form of a stream to the 
     // parser. 
     parser.setInput(new StringReader(r.replaceAll("&", "&amp;"))); 
     // as a SAX parser this will raise events/callback as and when it 
     // comes to a element. 
     int parserEvent = parser.getEventType(); 
     // we go thru a loop of all elements in the xml till we have 
     // reached END of document. 
     while (parserEvent != XmlPullParser.END_DOCUMENT) { 
      switch (parserEvent) { 
      // if u have reached start of a tag 
      case XmlPullParser.START_TAG: 
       // get the name of the tag 
       String tag = parser.getName(); 

bien ce que je fais, je vais juste remplacer le & avec &amp; depuis que je traitais l'analyse d'une URL. J'espère que cela aide.