Est-il un moyen plus simple de parser XML en Java?
Je suis à essayer de comprendre comment parser du XML (pour une application Android), et il semble assez ridicule combien il est difficile de le faire en Java. Il semble que cela nécessite la création d'un XML gestionnaire qui dispose de différents rappels (startElement, endElement, et ainsi de suite), et vous devez alors prendre soin de changer toutes ces données dans des objets. Quelque chose comme ce tutoriel.
Tous j'ai vraiment besoin de faire est de modifier un document XML dans un tableau multidimensionnel, et même mieux serait d'avoir une sorte de Hpricot processeur. Est-il possible de faire cela, ou dois-je vraiment écrire tout le code dans l'exemple ci-dessus?
- Votre premier lien est rompu.
- Si vous êtes uniquement intéressé par l'analyse (petite) des fichiers de configuration XML, je vous conseille de prendre un coup d'oeil à XPath. J'ai l'habitude de travailler avec, car il permet un accès très facile. La performance est de pire si vous travaillez avec des fichiers XML bien.
Vous devez vous connecter pour publier un commentaire.
Il y a deux différents types de processeurs XML en Java (3 en fait, mais l'un est bizarre). Ce que vous avez est un analyseur SAX et ce que vous voulez, c'est un DOM parser. Jetez un oeil à http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/pour savoir comment utiliser le DOM parser. DOM va créer une arborescence qui vous permet de naviguer assez facilement. SAX est le meilleur pour les documents volumineux mais DOM est beaucoup plus facile si plus lent et beaucoup plus gourmande en mémoire.
Essayer http://simple.sourceforge.net, son XML pour Java de sérialisation et de cadre contraignant, de son entièrement compatible avec Android et est très léger, 270K et pas de dépendances.
Vérifier cet article pour les moyens de gérer XML sur Android. Peut-être que le DOM ou XML Pull style adapté à votre style mieux
Travailler avec XML sur Android
Kyle,
(Veuillez excuser l'auto-promotey la nature de ce post... j'ai travaillé sur cette bibliothèque pendant des mois et c'est tout l'open source/Apache 2, donc pas que l'auto-portion, juste essayer d'aider).
Je viens de sortir d'une bibliothèque, je vais appeler SJXP ou "Simple Java XML Parser"
http://www.thebuzzmedia.com/software/simple-java-xml-parser-sjxp/
C'est un très petit/serré (4 classes) de la couche d'abstraction qui se trouve au-dessus de tout conformes aux spécifications XML Tirer de l'Analyseur.
Sur Android et non-Android plates-formes Java, tirez l'analyse est probablement l'un des plus performants (à la fois en vitesse et faible surcharge de la mémoire) les méthodes d'analyse. Malheureusement codage directement à l'encontre d'un pull-analyseur finit par regarder un peu comme tout les autres d'analyse XML code (par exemple, SAX), vous avez des gestionnaires d'exception, le maintien de l'analyseur de l'état, contrôle d'erreur, gestion des événements, l'analyse des valeurs, etc.
Ce SJXP ne vous permet de définir XPath-comme des "chemins" dans un document des éléments ou des attributs que vous voulez les valeurs, comme:
et il invoquera votre rappel, la valeur, lorsque cette règle correspond. L'API est vraiment simple et intuitive, le soutien pour l'espace de noms qualifiés éléments, si c'est ce que vous essayez d'analyser.
Le code pour une norme de l'analyseur devrait ressembler à quelque chose comme ceci (un exemple qui traite un RSS2 le titre du fil):
alors que vous venez de créer un parseur xml instance et de lui donner toutes les règles que vous le souhaitez à des soins sur:
Et c'est elle, l'analyseur va appeler la méthode de gestionnaire à chaque fois que la règle s'applique. Vous pouvez arrêter l'analyse à tout moment en appelant l'analyseur.stop() si vous le souhaitez.
De plus (et c'est le vrai gagnant de cette bibliothèque) d'espace de noms correspondant qualifié des éléments et des attributs est mort facile, il suffit d'ajouter leur URI d'espace de noms à l'intérieur de crochets en préfixant le nom de l'élément dans votre chemin.
Un exemple, disons que vous voulez obtenir de l'élément à un flux RSS afin que vous pouvez dire à quelle langue il est (ref: http://web.resource.org/rss/1.0/modules/dc/). Il vous suffit d'utiliser l'unique URI d'espace de noms pour que la "langue" de l'élément avec le 'dc' préfixe, et la règle de chemin d'accès finit par ressembler à ceci:
Il en va de même pour l'espace de noms qualifiés attributs.
Avec tout ce que la facilité, la seule surcharge de vous ajouter à l'analyse de processus est un O(1) hachage de recherche à chaque endroit du document XML et de quelques centaines d'octets, peut-être 1k, pour l'intérieur de l'emplacement de l'état de l'analyseur.
La bibliothèque fonctionne sur Android avec pas de dépendances supplémentaires (car la plate-forme fournit un org.xmlpull impl déjà) et dans tout autre Java runtime par l'ajout de la XPP3 dépendance.
Cette bibliothèque est le résultat de plusieurs mois d'écriture personnalisé tirer des analyseurs syntaxiques pour chaque type de flux XML dans chaque langue et de la réalisation (dans le temps) qu'environ 90% de l'analyse peut être distillée dans cet vraiment paradigme de base.
J'espère que vous trouverez à portée de la main.
De départ w/Java 5, il existe un chemin XPath de la bibliothèque dans le SDK. Voir ce tutoriel pour une introduction à celui-ci.
Selon moi, vous devriez utiliser l'analyseur SAX parce que:
- Rapide
- vous pouvez tout contrôler dans le document XML
Vous aurez à payer plus de temps pour le codage, mais elle est encore une fois parce que vous allez créer modèle de code pour parser XML
De second cas, vous n'modifier le contenu de changements.
Bonne chance!
J'ai créé vraiment une API simple pour résoudre précisément ce problème. C'est juste une seule classe que vous pouvez inclure dans votre base de code et c'est vraiment propre et facile à parser XML. Vous pouvez le trouver ici:
http://argonrain.wordpress.com/2009/10/27/000/
Vous pouvez essayer cette
http://xml.jcabi.com/
C'est une couche supplémentaire sur le dessus de DOM qui permet une analyse simple, d'impression et de transformation de documents XML et les nœuds
À mon avis, à l'aide de XPath pour l'analyse de XML peut être votre meilleure approche de codage. Vous pouvez incarner la logique de la sortir, des nœuds d'un document XML dans une expression unique, plutôt que d'avoir à écrire le code permettant de parcourir le document de l'objet graphique.
Je remarque que un autre posté réponse à cette question déjà suggéré à l'aide de XPath. Mais pas encore pour votre projet Android. À partir de maintenant, XPath l'analyse de classe n'est pas encore pris en charge dans tous les Android version (même si la javax.xml espace de noms est défini dans la JVM Dalvik, qui pourrait vous tromper, comme il l'a fait m'a d'abord).
Inclusion de XPath classe dans Android est un élément de travail en cours à la fin de la phase. (Il est en cours de test et de débogage par Google alors que j'écris ceci). Vous pouvez le suivi de l'état de l'ajout de XPath pour Davlik ici: http://code.google.com/p/android/issues/detail?id=515
(C'est d'un ennui que vous ne pouvez pas assumer les choses prises en charge dans la plupart des machines virtuelles Java sont encore comprises dans l'Android Dalvik VM.)
Une autre option, en attendant officiel de Google de soutien, c'est JDOM, actuellement revendications Dalvik VM compatibilité et également en charge de XPath (en version bêta). (Je n'ai pas vérifié cela; je suis juste répéter des revendications à partir de leur site web.)
Vous pouvez également utiliser Castor pour mapper le fichier XML en Java beans. Je l'ai utilisé avant et il fonctionne comme un charme.
Écrit
SAX handler
est la meilleure façon d'aller. Et une fois que vous faites cela, vous ne serez jamais revenir à autre chose. C'est rapide, simple et elle croque loin que ça va, pas de sucer des grosses parties ou à dieu ne plaise ensemble des DOM en mémoire.Un couple de semaines, j'ai battues une petite bibliothèque (un wrapper autour de
javax.xml.stream.XMLEventReader
) permettant de parser XML d'une manière similaire à un écrit à la main descente récursive de l'analyseur. La source est disponible sur github, et un simple exemple d'utilisation ci-dessous. Malheureusement, Android ne prend pas en charge cette API, mais il est très similaire à laXmlPullParser
de l'API, qui est pris en charge, et le portage de ne pas prendre trop de temps.Il est un très bon exemple montre pour XmlPullParser pour tout type de xml. Il pourrait également analyser comme une façon générique, vous n'avez pas besoin de modifier quelque chose pour que juste obtenir que les classes et les mettre dans votre projet android.
Générique XmlPullParser
Bien l'analyse de XML n'est pas une tâche facile.
Sa structure de base est un arbre avec n'importe quel nœud de l'arbre est capable de tenir un conteneur qui consiste en un ensemble de plus d'arbres.
Chaque nœud de l'arbre contient une balise et une valeur, mais en outre peut contenir un nombre arbitraire d'attributs nommés, et, d'un arbitraire nombre d'enfants ou de conteneurs.
D'analyse XML tâches ont tendance à se répartissent en trois catégories.
Choses qui peut être fait avec "regex". E. g. vous souhaitez trouver la valeur de la première "MailTo" tag et ne sont pas intéressés par le contenu de toutes les autres balises.
Choses que vous pouvez traiter vous-même. La structure xml est toujours très simple de l'e.g un nœud racine et dix bien connu des étiquettes avec des valeurs simples.
Tout le reste! Même si un message xml format de l'air faussement simple et faite maison analyseurs sont facilement confondus par des attributs supplémentaires, CDATA inattendus et les enfants. Complet soufflé parseurs XML peut gérer toutes ces situations. Ici, le choix de base est entre un ruisseau ou d'un DOM parser. Si vous avez l'intention d'utiliser la plupart des entités ou à des attributs donnés dans l'ordre que vous souhaitez utiliser, puis un DOM parser est idéal. Si vous êtes uniquement intéressé par quelques attributs et l'intention d'utiliser dans l'ordre où ils sont présentés, si vous avez des contraintes de performance, ou si les fichiers xml sont de grande taille ( > 500 MO ) que d'un flux de données de l'analyseur est le chemin à parcourir; le mécanisme de rappel prend un peu de "groking" mais en fait assez simple de programme une fois que vous obtenez le coup de lui.