2010-08-05 5 views
7

Je suis actuellement en train de développer une application qui récupère des données d'Internet en utilisant SAX. Je l'ai déjà utilisé pour analyser des fichiers XML simples comme Google Weather API. Cependant, les sites Web qui m'intéressent prennent l'analyse au prochain niveau. La page est énorme et a l'air en désordre. J'ai seulement besoin de récupérer certaines lignes spécifiques; le reste n'est pas utile pour moi.
Est-il possible d'ignorer ces lignes/tags inutiles, ou dois-je aller pas à pas?Analyse de gros fichiers XML à l'aide de l'analyseur syntaxique SAX (ignore certaines lignes/tags)

+0

Je pense que VTD-xml étendu vous permet d'accéder à XML avec un accès aléatoire d'une manière efficace de la mémoire, bien mieux que SAX ou digesteur apache –

Répondre

1

Oui, vous pouvez ignorer. Il suffit de définir les balises que vous voulez et il ne récupérera que ces valeurs de balise.

+0

Thaks un Lot, votre réponse me sauvera temps lignes de codes! – Amine

1

Vous pouvez essayer d'utiliser XPath qui utilisera SAX derrière la scène pour analyser votre fichier XML. L'inconvénient ici est que XML sera analysé à chaque appel de la méthode d'évaluation Xpath.

+0

Merci pour votre réponse je vais regarder dans cette possibilité! – Amine

1

Vous vous voulez lire des balises spécifiques puis analyseur DOM est beaucoup plus rapide que l'analyseur SAX parser..SAX est utile si vous voulez analyser de gros fichiers XML ..

+0

L'analyse syntaxique SAX est beaucoup plus rapide que DOM. DOM exige également que le document entier soit mis en mémoire. –

+0

Merci beaucoup pour votre réponse, j'apprécie vraiment votre aide, j'essaierai d'utiliser DOM et de voir quelles sorties je reçois! – Amine

2

Oui, vous pouvez le faire, ignorer les balises vous n'êtes pas intéressé. Mais notez que l'ensemble du document devra être analysé pour cela (DefaultHandler impl)

public startElement(String uri, String localName, 
    String qName, Attributes attributes) { 
    if(localName.equals("myInterestingTag") { 
    // do your thing.... 
    } 
} 

public void endElement(String uri, String localName, String qName) { 
    if(localName.equals("myInterestingTag") { 
    // do your thing.... 
    } 
} 

public void characters(char[] ch, int start, int length) { 
    // if parsing myinteresting tag... do some stuff. 
} 
+0

Merci, c'est exactement comme ça que je le fais habituellement;)! – Amine

1

vous pouvez essayer une combinaison de TagSoup pour créer un document XML analysable et XPath pour aller chercher les pièces intéressantes .

+0

merci DaDaDom pour votre réponse je vais regarder dans ce dès que possible! – Amine

+0

malheureusement en utilisant xpath n'est pas si facile sur Android – Janusz

1

Voir ma réponse à une question similaire pour une stratégie d'utilisation SAX pour sauter/ignorer tags:

Skipping nodes with sax

Il implique la commutation ContentHandlers sur le XMLReader. Lorsque vous lisez un portage du document XML que vous souhaitez ignorer, il vous suffit d'échanger un ContentHandler qui ne fait rien avec les événements. Lorsque la fin de la section à ignorer est atteinte, le contrôle est renvoyé au gestionnaire de contenu que vous utilisiez pour traiter le contenu XML.

+0

Votre réponse va certainement aider à atteindre mon objectif!merci beaucoup -Cheers – Amine

4

J'aime commons-digester. Il vous permet de spécifier des règles par rapport à des tags particuliers. La règle est exécutée uniquement lorsque la balise est rencontrée. Digest est construit sur sax et possède donc toutes les fonctions de sax plus la spécificité nécessaire pour analyser de manière sélective des tags spécifiques. Il utilise également une pile qui est poussée avec de nouveaux éléments au fur et à mesure que la balise correspondante est rencontrée et qui apparaît lorsque l'élément se termine. Je l'utilise pour analyser tous mes fichiers de configuration.

Découvrez digesteur à http://commons.apache.org/digester/

+0

Merci beaucoup Raja, je vais regarder dans cette solution !! – Amine