2010-04-05 4 views
1

Je suis en train d'analyser un schéma XML très simple avec un analyseur SAX sous Android.Annuler l'analyse syntaxique de SAX?

Un fichier exemple serait

<Lists> 
<List name="foo"> 
<Note title="note 1" .../> 
<Note title="note 2" .../> 
</List> 
<List name="bar"> 
<Note title="note 3" .../> 
</List> 
</Lists> 

Le ... représente plus de données note que les attributs qui ne sont pas importants à la question.

J'utilise un analyseur SAX pour analyser le document et implémenter uniquement les méthodes startElement et 'endElement' de HandlerBase pour gérer les noeuds Note et List.

Cependant, dans certains cas, les fichiers peuvent être très volumineux et prendre du temps à traiter. Je voudrais être en mesure d'annuler le processus d'analyse à tout moment (c'est-à-dire que l'utilisateur appuie sur le bouton d'annulation). Le meilleur moyen que j'ai trouvé est de lancer une exception de ma méthode startElement lorsque certaines conditions sont remplies (c'est-à-dire boolean stopParsing est vrai).

Existe-t-il une meilleure façon de procéder? J'ai toujours utilisé des analyseurs de style DOM, donc je ne comprends pas complètement l'analyseur syntaxique SAX. Une note finale, je cours cela sur Android, donc je vais avoir l'analyseur en cours d'exécution sur un thread de travail pour garder l'interface utilisateur sensible. Si vous savez comment je peux tuer le fil en toute sécurité pendant l'exécution de l'analyseur, cela répondrait à ma question.

Répondre

2

Vous pourriez vouloir regarder dans XMLPullParser car cela pourrait être effectué facilement en n'appelant simplement pas la méthode suivante. Vous avez plus de contrôle sur l'analyse syntaxique.

XmlPullParser xpp=getResources().getXml(R.xml.lists); 
while (xpp.getEventType()!=XmlPullParser.END_DOCUMENT) { 
    if (xpp.getEventType()==XmlPullParser.START_TAG) { 
     if (xpp.getName().equals("list")) { 
      items.add(xpp.getAttributeValue(0)); 
     } 
    } 

    xpp.next(); 
} 
+0

Cela semble bon. La seule chose que je dois comprendre maintenant est comment l'arrêter dans un thread de travail. – CodeFusionMobile

+0

Événement meilleur, essayez d'utiliser Stax (javax.xml.stream) car il s'agit de l'API standard de l'analyseur par extraction, et impl est inclus dans JDK 1.6 (ou peut utiliser Woodstox en externe) – StaxMan

Questions connexes