7
votes

Analyse de gros fichiers XML à l'aide d'un analyseur SAX (sauter des lignes / tags)

Je développe actuellement une application qui récupère des données d'Internet en utilisant saxo. Je l'ai déjà utilisé pour analyser de simples fichiers XML tels que Google Weather API. Cependant, les sites Web que je suis intéressé à adopter un analysement au niveau suivant. La page est énorme et a l'air désordonnée. Je n'ai besoin que de récupérer des lignes spécifiques; Le reste n'est pas utile pour moi.
Est-il possible de sauter ces lignes / tags inutiles ou dois-je aller étape par étape?


1 commentaires

Je pense que VTD-XML étendu vous permet d'accéder à XML avec un accès aléatoire à la mémoire efficace de la mémoire, bien mieux que la SAX ou Digester Apache


7 Réponses :


1
votes

Oui, vous pouvez sauter. Définissez simplement ces balises que vous voulez et cela ne cherchera que ces valeurs de balise.


0 commentaires

1
votes

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


1 commentaires

Merci pour votre réponse, je vais examiner cette possibilité!



1
votes

Vous souhaitez lire des balises spécifiques, l'analyseur DOM est beaucoup plus rapide que Sax Parser..sax Parser est utile si vous souhaitez analyser de gros fichiers XML.


2 commentaires

L'analyse de la SAX est beaucoup plus rapide que DOM. DOM exige également que l'ensemble du document soit mis en mémoire.


Merci beaucoup pour votre réponse, j'apprécie vraiment votre aide, j'essaierai d'utiliser Dom et de voir les sorties que je reçois!



2
votes

Oui, vous pouvez simplement le faire, ignorez simplement les tags que vous n'êtes pas intéressé. Mais notez que l'ensemble du document devra être analysé pour cela (DEFAULTHANDLER IMP)

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.
}


1 commentaires

Merci, c'est exactement comment je le fais habituellement;)!



1
votes

Vous pouvez essayer une combinaison de tagsoup pour créer un document XML analysé et XPath pour récupérer les parties intéressantes.


1 commentaires

Malheureusement, utiliser xpath n'est pas si facile sur Android



1
votes

Voir ma réponse à une question similaire pour une stratégie d'utilisation de saxo à sauter / ignorer les balises:

Sauter des nœuds avec saxo

Il implique de changer de contenu de contenu sur le xmlreader. Lorsque vous lisez un portage du document XML, vous souhaitez vous sauter simplement échanger dans un contenu de contenu qui ne fait rien avec les événements. Lorsque la fin de la section à ignorer est atteinte, il passe le contrôle du gestionnaire de contenu que vous utilisiez pour traiter le contenu XML.


1 commentaires

Votre réponse aidera certainement à atteindre mon objectif! merci beaucoup -cheers



4
votes

J'aime les communes-digestester. Il vous permet de spécifier des règles contre des balises particulières. La règle n'est exécutée que lorsque la balise est rencontrée.

digesther est construit sur SAX et dispose donc de toutes les fonctionnalités SAX et de la spécificité requise pour analyser sélectivement des balises spécifiques. Il utilise également une pile qui est poussée avec de nouveaux éléments comme et lorsque la balise correspondante est rencontrée et est apparue lorsque l'élément se termine.

Je l'utilise pour analyser tous mes fichiers de configuration.

Vérifiez digester chez http://commons.apache.org/digester/


1 commentaires

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