Introduction DOM4J
Adresse du projet de DOM4J: http://sourceforge.net/projects/dom4j/?source=directory
Dom4j est une bibliothèque open source simple pour gérer XML, XPATH et XSLT.
Dom4j utilise DOM4J après avoir téléchargé le projet DOM4J, se dézip et ajouter son package JAR (ma version actuelle est appelée DOM4J-1.6.1.jar) sur le chemin de classe.
(Propriétés-> Chemin de construction Java-> Ajouter des pots externes ...).
Ensuite, vous pouvez utiliser l'API qu'il fournit pour la programmation.
Exemple de programme 1
Le premier programme utilise le code Java pour générer un document XML, et le code est le suivant:
package com.example.xml.dom4j; import java.io.fileOutputStream; import java.io.filewriter; import org.dom4j.document; import org.dom4j.documenthel per; import org.dom4j.element; import org.dom4j. io .outputformat; import org.dom4j.io.xmlwriter; / ** * framework Dom4j apprend à utiliser le framework Dom4j pour créer un document XML et une sortie et enregistrer * * / classe publique Dom4JTest1 {public static void main (strin g [] Args) lance l'exception {// la première méthode: créer un document et créer un élément racine // Créer un document: Utilisez une classe d'aide document = documentHelper.CreateDocument (); root = documentHelper.CreateElement ("st udent"); Document2 = documentHelp er.CreateDocument (root2); Élément worldElement = root2.add élément (world "); .writ e (document); "Stud Ent.xml"), format); Filewriter ("Student2.xml"), format);
Sortie de la console de programme:
<? xml version = "1.0" Encoding = "UTF-8"?> <Student />
Un document XML généré:
<? xml version = "1.0" Encoding = "UTF-8"?> <Student name = "Zhangsan"> <Lello> Hello Text </ Hello> <World> World Text </ World> </Student>
Exemple de programme 2
Exemple du programme 2, lisez le document XML et analysez-le, et émettez son contenu.
Premièrement, les documents à analyser sont les suivants:
<? xml version = "1.0" Encoding = "utf-8"?> <étudiants name = "zhangsan"> <Bonjour name = "lisi"> Bonjour text1 </lolo> <Hello name = "lisi2"> Bonjour Text2 < : :::::::::::::::::::::::::::::::::::- : :::::::::::::::::::::::::::::::::::- : :::: :::: ::: ::::::::::::::::::: :: / Hello> <Hello name = "Lisi3"> Hello Text3 </ Hello> <World Name = "Wangwu "> World Text1 </World> <World Name =" Wangwu2 "> World Text2 </World> <World> World TE XT3 </ World> </Dimente> Package com.example.xml.dom4j; Importer Java.io. Fichier; import java.util.iterator; import java.util.list; import javax.xml.parsers .DocumentBuilder; import Javax. .dom4j.io.domreader; import org.dom4j.io.saxread er; / ** * Dom4j Framework Apprentissage: lire et analyser xml * * * / public class Dom4Jtest2 {public static void main (String [] args) lance l'exception { SAXREDER SAXREADER = NEW SAXREADER (); "+ root.getName ()); // Obtenez tous les éléments de l'enfant Liste <enlement> childlist = root.elements (); System. Out.println (" Total Child Count: "+ ChildList.Size ()); // Get L'élément enfant d'une liste de noms spécifique <Element> ChildList2 = root.Elements ("Hello"); L'élément de nom spécifié firstworldElement = root.element ("world"); attributValue ("nom"); Iterator iter = root.elementIrator (); println ("Utilisez DomReader --------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------- DocumentBuilderFactory DBF = DocumentBuilderFactory.NewInstance (); W3C.Dom.Document doit être utilisé Document2 = DB.Parse (nouveau fichier ("Students.xml"); Élément rootElement = document3.get rootElement ();
Une fois le code exécuté, la sortie est:
Racine: Étudiant Nombre d'enfants: 6hello Enfant: 3First World Att: Nom = Wangwu Itreative Sortie -------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------- Ader ----- ------ ------------------ Racine: étudiants
Sax Parses XML
Voici les étapes pour implémenter l'analyse des entités en sax
// Ce qui suit est un XMLReader pour analyser (i) Étape 1: Créez une nouvelle classe d'usine SAXPARSERFACTORY, le code est le suivant:
SAXPARSERFACTORY FACTORY = SAXPARSERFACTORY.NEWInstance ();
(2) Étape 2: Laissez la classe d'usine générer une classe de sax-analyse saxparser, le code est le suivant:
SaxParser parser = factory.newSaxParser ();
(Iii) Étape 3: Obtenez une instance XMLReader de SAXPSRSER, le code est le suivant:
XmlReader Reader = parser.getXmlReader ();
(4) Étape 4: Enregistrez le gestionnaire que vous avez écrit dans le XMLReader.
Reader.SetContentHandler (this);
(V) Étape 5: Après avoir transformé un document ou une ressource XML en un flux InputStream que Java peut traiter, l'analyse commence officiellement, et le code est le suivant:
Reader.Parse (New InputSource (IS));
// Ce qui suit consiste à utiliser SAXPARSER pour analyser (i) la première étape: créer une nouvelle classe d'usine SAXPARSERFACTORY, le code est le suivant:
SAXPARSERFACTORY FACTORY = SAXPARSERFACTORY.NEWInstance ();
(2) Étape 2: Laissez la classe d'usine générer une classe de sax-analyse saxparser, le code est le suivant:
SaxParser parser = factory.newSaxParser ();
(3) Étape 3: Après avoir transformé un document ou une ressource XML en un flux InputStream que Java peut traiter, l'analyse commence officiellement et le code est le suivant:
parser.parse (est, ceci);
Je suppose que tout le monde a vu ContentHandler.
// Définissez un objet de localisation qui peut localiser l'emplacement où l'événement de contenu du document se produit
public void SetDocumentLocator (localisateur)
// Utilisé pour gérer l'événement de début d'analyse de documents
public void startDocument () lève saxexception
// Traitez l'événement de démarrage de l'élément, et vous pouvez obtenir l'uri, le nom de l'élément, la table de classe d'attribut et d'autres informations de l'espace de noms où l'élément est situé à partir des paramètres.
public void startElement (String namespaceSuri, String localName, String Qname, attributes atts) lève saxException
// Gérez l'événement Element End, et vous pouvez obtenir l'uri, le nom de l'élément et d'autres informations de l'espace de noms où l'élément est situé à partir des paramètres.
public void Endelement (String NamespacesUri, String localName, String Qname) lève saxException
// traite le contenu du caractère de l'élément, et vous pouvez obtenir le contenu des paramètres
Les caractères publics publics (Char [] Ch, int start, int le long) lève saxException
Soit dit en passant, présentons les méthodes dans XMLReader.
// Enregistrer et gérer le document XML Analyse du document ContentHandler
public void SetContentHandler (contenu Handler)
// commence à analyser un document XML
Public void Parse (entrée d'entrée) lève saxexception saxexception
J'ai terminé à peu près.
package com.example.demo; ) {return _id;} public void set_id (string _id) {this._id = _id; () {return _age;} public void set_age (String _age) {this._age = _age;
Ensuite, nous voulons implémenter un contenuhandler pour analyser XML
L'implémentation d'un contenuhandleur nécessite généralement les étapes suivantes
1. Déclarer une classe et hériter Defaulthandler. Defaulthandler est une classe de base, qui implémente simplement un contenu Handleler. Nous avons juste besoin de réécrire la méthode à l'intérieur.
2. Rewrite StartDocument () et EndDocument ().
3. Rewrite startElement (). Souvent, certaines données sont exploitées dans cette fonction en jugeant la valeur du nom local.
4. Réécrivez la méthode des caractères (), qui est une méthode de rappel. Après que l'analyseur ait exécuté startElement (), cette méthode sera exécutée après l'analyse du contenu du nœud, et le paramètre ch [] est le contenu du nœud.
5. Réécrivez la méthode Endement (). Le Defaulthandler et Rere écrivent les méthodes suivantes
classe publique SAX_PARSERXML étend Defaulthandler {/ ** * Cet événement sera déclenché lors de l'analyse de la déclaration du fichier XML. Méthode Stub super.startDocument ();} / ** * Cet événement sera déclenché lors de l'analyse {// TODO Méthode générée automatiquement Stume Super.Startellement (URI, LocalName, QName, Attributs);} / ** * Cet événement sera déclenché lors de la lecture d'un élément de texte. ] ch, int start, int le long) lève saxException {// TODO Méthode générée automatiquement Super.Characters (ch, start, longueur); @Override public void Endement (String Uri, String localName, String Qname) lève saxException {// TODO Méthode générée automatiquement Super.endement T (Uri, LocalName, QName);
Tout d'abord, nous créons une liste pour enregistrer les données de la personne analysée
Lister les <hondiques);
mais? Où initialiser? Nous pouvons l'initialiser dans startDocument (), car cet événement sera déclenché lors de l'analyse de la déclaration du fichier XML, il est donc plus approprié de le mettre ici
/ ** * Cet événement sera déclenché lors de l'analyse de la déclaration du fichier XML. );
Ensuite, nous commencerons à analyser
/ ** * Cet événement sera déclenché lors de l'analyse de la balise de démarrage d'un élément * * / @Override public void startElement (String Uri, String localName, String Qname, Attributes Attributes) lance saxException {// .Startelement (Uri, LocalName, QName, Attributs); attributs.getValue ("id");} curnode = localName;
Dans le code ci-dessus, le nom local représente le nom d'élément actuellement analysé
// étape // 1. ** * Cet événement est déclenché lors de la lecture d'un élément de texte. , démarrer, longueur); égal (name ")) {// Ajouter la valeur récupérée à l'objet de la personne.
Ensuite, c'est ce que vous devez faire à la fin de la balise
/ ** * Cet événement sera déclenché lorsque la balise de fin est lue * * / @Override public void Endelement (String Uri, String localName, String Qname) lève saxException {// too Auto-Gen Erupted Method Stub super.endement (uri , LocalName, QName); : :::::::::::::::::::::::::::::::::::- ::::::::::::: "";
L'analyse est probablement le processus
1. La méthode startElement sera appelée au début d'un élément.
2. La méthode des caractères sera appelée Next, qui peut être utilisée pour obtenir la valeur de l'élément.
3. Lorsqu'un élément se termine, la méthode d'endettement sera appelée une fois l'analyse terminée.
Public List <Sonde> readxml (InputStream IS) {SAXPARSERFACTORY FACTORY = SAXPARSERFACTORY.NEWInstance (); Deuxième méthode xmlReader Lecteur = PARSER.getXmlReader (); Reader.setContentHandler (this); Reader.Pares (new InputSource (IS)); retour des personnes;}
Le code ci-dessus n'explique pas.
package com.example.demo.utils; .xml.Sax.AtTributes; Demo.So SAXPARSER PARSER = FACTORY.NEWSAXPARSER (); (Nouveau entrée (IS));} Catch (Exception e) {// TODO: Gire Exception e.PrintStackTrace (); Vous pouvez faire des travaux d'initialisation * * / @Override public void startDocument () lance saxException {// TODO Méthode générée automatiquement Super.StartDocument (); * * Cet événement sera déclenché lors de l'analyse de la balise de démarrage d'un élément * * / @Override public void startElement (String Uri, String localName, String Qname, Attributes Attributs) lance sa xexception {// TODO Auto-généré par Stub Super. startElement (Uri, LocalName, QName, Attributs); .getValue ("id");} Curnode = LocalName;} / ** * Cet événement sera déclenché lors de la lecture d'un élément de texte. lance un épisode saxexc {// TODO Méthode générée automatiquement Stume Super.Characters (ch, start, longueur); start, longueur); "Age")) {personne. lance un épisode SAXEXC {// TODO Méthode générée par Stume Super.endElement (URI, LocalName, QName); personne! = null) {p ersons.add (personne);
Écrivez une méthode pour appeler cette classe
List <ponse> Persons = new SAX_PARSERXML (). ReadXml (IS); StringBuffer Buffer = new StringBuffer (); ); .get_age () + "/ n");} toast.makeText (activité, toast.length_long) .show ();
Si vous voyez la description de l'interface suivante, l'analyse a été réussie ~
résumé:
DOM (modèle d'objet de fichier) Analyse: l'analyseur lit l'ensemble du document, puis construit une structure d'arborescence résidente de la mémoire et le code peut faire fonctionner cette structure d'arbre en fonction de l'interface Dom.
Avantages: L'ensemble du document est lu dans la mémoire, pratique pour fonctionner: prend en charge diverses fonctions telles que la modification, la suppression, la reproduction et la disposition.
Inconvénients: lisez l'ensemble du document en mémoire, en conservant trop de nœuds inutiles, gaspillant la mémoire et l'espace.
Utilisez des occasions: une fois le document lu, le document doit être utilisé plusieurs fois et lorsque les ressources matérielles sont suffisantes (mémoire, CPU).
Afin de résoudre les problèmes existants dans l'analyse DOM, l'analyse de sax se produit. Ses caractéristiques sont:
Avantages: Pas besoin de mettre en œuvre l'intégralité du document, qui prend moins de ressources. En particulier dans les environnements intégrés, tels que Android, il est fortement recommandé d'utiliser l'analyse de saxophone.
Inconvénients: Contrairement à l'analyse DOM, les données ne sont pas persistantes. Si les données ne sont pas enregistrées après l'événement, les données seront perdues.
Utiliser l'occasion: la machine a des limitations de performances