En Java, il existe deux manières d'analyser nativement les documents XML, à savoir : l'analyse Dom et l'analyse Sax.
La fonction d'analyse Dom est puissante et peut être ajoutée, supprimée, modifiée et vérifiée. Pendant le fonctionnement, le document XML sera lu dans la mémoire sous la forme d'un objet document, il convient donc aux petits documents.
L'analyse Sax lit le contenu ligne par ligne et élément par élément du début à la fin. Il est plus gênant à modifier, mais il convient aux gros documents en lecture seule.
Cet article explique principalement l'analyse Sax, et le reste sera placé plus tard.
Sax utilise une approche événementielle pour analyser les documents. Pour faire simple, c'est comme regarder un film au cinéma. Vous pouvez le regarder du début à la fin sans revenir en arrière (Dom peut le lire d'avant en arrière).
En regardant un film, chaque fois que vous rencontrez une intrigue, une larme ou une rencontre épaule contre épaule, vous mobiliserez votre cerveau et vos nerfs pour recevoir ou traiter cette information.
De même, pendant le processus d'analyse de Sax, la lecture du début et de la fin du document, ainsi que du début et de la fin de l'élément, déclenchera certaines méthodes de rappel. Vous pouvez effectuer le traitement des événements correspondant dans ces méthodes de rappel.
Les quatre méthodes sont : startDocument(), endDocument(), startElement(), endElement
De plus, il ne suffit pas de lire le nœud. Nous avons également besoin de la méthode caractères() pour traiter soigneusement le contenu contenu dans l'élément.
En rassemblant ces méthodes de rappel, une classe est formée, qui est le déclencheur dont nous avons besoin.
Généralement, le document est lu à partir de la méthode Main, mais le document est traité dans le déclencheur. Il s'agit de la méthode dite d'analyse basée sur les événements.
Comme indiqué ci-dessus, dans le déclencheur, il commence d'abord à lire le document, puis à analyser les éléments un par un. Le contenu de chaque élément sera renvoyé à la méthode caractères().
Terminez ensuite la lecture des éléments. Une fois tous les éléments lus, terminez l’analyse du document.
Nous commençons maintenant à créer la classe de déclenchement. Pour créer cette classe, nous devons d'abord hériter de DefaultHandler.
Créez SaxHandler et remplacez la méthode correspondante :
la classe publique SaxHandler étend DefaultHandler {
/* Cette méthode a trois paramètres
arg0 est le tableau de caractères renvoyé, qui contient le contenu de l'élément
arg1 et arg2 sont respectivement les positions de début et de fin du tableau*/
@Outrepasser
les caractères publics vides (char[] arg0, int arg1, int arg2) lancent SAXException {
Contenu de la chaîne = new String(arg0, arg1, arg2);
System.out.println(contenu);
super.characters(arg0, arg1, arg2);
}
@Outrepasser
public void endDocument() lance SAXException {
System.out.println("/n...Fin de l'analyse du document...");
super.endDocument();
}
/* arg0 est l'espace de noms
arg1 est l'étiquette contenant l'espace de noms, ou vide s'il n'y a pas d'espace de noms
arg2 est une étiquette sans espace de noms*/
@Outrepasser
public void endElement (String arg0, String arg1, String arg2)
lance SAXException {
System.out.println("Fin de l'élément d'analyse" + arg2);
super.endElement(arg0, arg1, arg2);
}
@Outrepasser
public void startDocument() lance SAXException {
System.out.println("…………Commencer à analyser le document………/n");
super.startDocument();
}
/*arg0 est l'espace de noms
arg1 est l'étiquette contenant l'espace de noms, ou vide s'il n'y a pas d'espace de noms
arg2 est l'étiquette sans espace de noms
arg3 est évidemment une collection d'attributs*/
@Outrepasser
public void startElement (String arg0, String arg1, String arg2,
Attributs arg3) lance SAXException {
System.out.println("Démarrer l'analyse des éléments" + arg2);
si (arg3 != nul) {
pour (int i = 0; i < arg3.getLength(); i++) {
// getQName() doit obtenir le nom de l'attribut,
System.out.print(arg3.getQName(i) + "=/"" + arg3.getValue(i) + "/"");
}
}
System.out.print(arg2 + ":");
super.startElement(arg0, arg1, arg2, arg3);
}
}
importer javax.xml.parsers.SAXParser ;
importer javax.xml.parsers.SAXParserFactory ;
classe publique TestDemo {
public static void main (String[] args) lève une exception {
// 1. Instanciez l'objet SAXParserFactory
Usine SAXParserFactory = SAXParserFactory.newInstance();
// 2. Créer un analyseur
Analyseur SAXParser = factory.newSAXParser();
// 3. Obtenez le document qui doit être analysé, générez un analyseur et enfin analysez le document
Fichier f = nouveau Fichier("books.xml");
SaxHandler dh = new SaxHandler();
parser.parse(f, dh);
}
}
Commencez à analyser les livres d'éléments
livres :
Commencez à analyser le livre d'éléments
id="001"livre :
Commencez à analyser le titre de l'élément
Titre : Harry Potter
Fin de l'analyse du titre de l'élément
Commencez à analyser l'auteur de l'élément
auteur:JK Rowling
Fin de l'auteur de l'élément d'analyse
Fin du livre d'éléments d'analyse
Commencez à analyser le livre d'éléments
id="002"livre :
Commencez à analyser le titre de l'élément
titre : Apprentissage du XML
Fin de l'analyse du titre de l'élément
Commencez à analyser l'auteur de l'élément
auteur:Erik T. Ray
Fin de l'auteur de l'élément d'analyse
Fin du livre d'éléments d'analyse
Fin de l'analyse des livres d'éléments
…………Fin de l'analyse du document…………
Afin d'exécuter ce processus plus clairement, nous pouvons également réécrire SaxHandler pour restaurer le document XML d'origine
Classe SaxHandler substituée :
la classe publique SaxHandler étend DefaultHandler {
@Outrepasser
les caractères publics vides (char[] arg0, int arg1, int arg2) lancent SAXException {
System.out.print(new String(arg0, arg1, arg2));
super.characters(arg0, arg1, arg2);
}
@Outrepasser
public void endDocument() lance SAXException {
System.out.println("/n termine l'analyse");
super.endDocument();
}
@Outrepasser
public void endElement (String arg0, String arg1, String arg2)
lance SAXException {
System.out.print("</");
System.out.print(arg2);
System.out.print(">");
super.endElement(arg0, arg1, arg2);
}
@Outrepasser
public void startDocument() lance SAXException {
System.out.println("Démarrer l'analyse");
Chaîne s = "<?xml version=/"1.0/" encoding=/"UTF-8/"?>";
System.out.println(s);
super.startDocument();
}
@Outrepasser
public void startElement (String arg0, String arg1, String arg2,
Attributs arg3) lance SAXException {
System.out.print("<");
System.out.print(arg2);
si (arg3 != nul) {
pour (int i = 0; i < arg3.getLength(); i++) {
System.out.print(" " + arg3.getQName(i) + "=/"" + arg3.getValue(i) + "/"");
}
}
System.out.print(">");
super.startElement(arg0, arg1, arg2, arg3);
}
}
Il semble bien meilleur maintenant et sa restauration illustre mieux son processus d'analyse.