Esperluette invalides avec Parsing Android XmlPullParser
-
20-09-2019 - |
Question
Je suis en train d'écrire une petite application de grattage écran qui consomme une XHTML - il va sans dire que le XHTML est invalide: esperluette ne sont pas échappés comme &
J'utilise le XmlPullParser
Android et 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 java.io.InputStreamReader@43b1ef70)
Comment puis-je contourner cela? J'ai pensé les solutions suivantes:
- Emballage du
InputStream
dans une autre qui remplace l'esperluette avec refs entité - Configuration du Parser il accepte comme par magie le balisage incorrect
Quels sont ceux qui sont susceptibles d'avoir plus de succès?
La solution
Je voudrais aller avec votre première option, le remplacement des esperluette semble plus d'une solution en forme que l'autre. La deuxième option semble plus d'un bidouille pour le faire fonctionner en acceptant le balisage incorrect.
Autres conseils
Je suis coincé sur ce pendant environ une heure avant de déterminer que, dans mon cas, il était le « et » qui ne pourraient être résolus par le parseur XML PULL, donc je l'ai trouvé la solution. Donc Voici un extrait de code qui fixe totalement.
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("&", "&")));
// 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();
à peu près ce que je fais, je vais juste remplacer le &
avec &
depuis que je traitais l'analyse d'une URL.
Espérons que cela aide.