In Java gibt es zwei Möglichkeiten, XML-Dokumente nativ zu analysieren: Dom-Parsing und Sax-Parsing.
Die Dom-Parsing-Funktion ist leistungsstark und kann während des Betriebs hinzugefügt, gelöscht, geändert und überprüft werden. Das XML-Dokument wird in Form eines Dokumentobjekts in den Speicher eingelesen, sodass es für kleine Dokumente geeignet ist.
Die Sax-Analyse liest den Inhalt Zeile für Zeile und Element für Element vom Anfang bis zum Ende. Das Ändern ist umständlicher, eignet sich jedoch für große schreibgeschützte Dokumente.
In diesem Artikel wird hauptsächlich die Sax-Analyse erläutert, der Rest wird später veröffentlicht.
Sax verwendet einen ereignisgesteuerten Ansatz zum Parsen von Dokumenten. Um es einfach auszudrücken: Es ist, als würde man einen Film im Kino ansehen. Man kann ihn von Anfang bis Ende ansehen, ohne zurückzugehen (Dom kann ihn hin und her lesen).
Jedes Mal, wenn Sie beim Ansehen eines Films auf eine Handlung, einen Riss oder eine direkte Begegnung stoßen, mobilisieren Sie Ihr Gehirn und Ihre Nerven, um diese Informationen aufzunehmen oder zu verarbeiten.
In ähnlicher Weise löst das Lesen des Anfangs und Endes des Dokuments sowie des Anfangs und Endes des Elements während des Parsing-Prozesses einige Rückrufmethoden aus. In diesen Rückrufmethoden können Sie eine entsprechende Ereignisverarbeitung durchführen.
Die vier Methoden sind: startDocument(), endDocument(), startElement(), endElement
Darüber hinaus reicht es nicht aus, den Knoten zu lesen. Wir benötigen auch die Methode „characters()“, um den im Element enthaltenen Inhalt sorgfältig zu verarbeiten.
Durch das Sammeln dieser Rückrufmethoden wird eine Klasse gebildet, die den Auslöser darstellt, den wir benötigen.
Im Allgemeinen wird das Dokument von der Main-Methode gelesen, aber das Dokument wird im Trigger verarbeitet. Dies ist die sogenannte ereignisgesteuerte Analysemethode.
Wie oben gezeigt, beginnt der Trigger zunächst mit dem Lesen des Dokuments und beginnt dann mit der Analyse der Elemente nacheinander. Der Inhalt jedes Elements wird an die Methode „characters()“ zurückgegeben.
Beenden Sie dann das Lesen der Elemente. Nachdem alle Elemente gelesen wurden, beenden Sie das Parsen des Dokuments.
Jetzt beginnen wir mit der Erstellung der Triggerklasse. Um diese Klasse zu erstellen, müssen wir zunächst DefaultHandler erben
Erstellen Sie SaxHandler und überschreiben Sie die entsprechende Methode:
öffentliche Klasse SaxHandler erweitert DefaultHandler {
/* Diese Methode hat drei Parameter
arg0 ist das zurückgegebene Zeichenarray, das den Elementinhalt enthält
arg1 und arg2 sind die Start- bzw. Endpositionen des Arrays*/
@Override
öffentliche leere Zeichen (char[] arg0, int arg1, int arg2) löst eine SAXException { aus
String-Inhalt = new String(arg0, arg1, arg2);
System.out.println(content);
super.characters(arg0, arg1, arg2);
}
@Override
public void endDocument() löst SAXException {
System.out.println("/n...Dokumentparsing beenden...");
super.endDocument();
}
/* arg0 ist der Namespace
arg1 ist die Bezeichnung, die den Namespace enthält, oder leer, wenn kein Namespace vorhanden ist
arg2 ist ein Label ohne Namespace*/
@Override
public void endElement(String arg0, String arg1, String arg2)
wirft SAXException {
System.out.println("Parsing-Element beenden" + arg2);
super.endElement(arg0, arg1, arg2);
}
@Override
public void startDocument() löst SAXException {
System.out.println("…………Starten Sie das Parsen des Dokuments………/n");
super.startDocument();
}
/*arg0 ist der Namespace
arg1 ist die Bezeichnung, die den Namespace enthält, oder leer, wenn kein Namespace vorhanden ist
arg2 ist die Bezeichnung ohne Namespace
arg3 ist offensichtlich eine Sammlung von Attributen*/
@Override
public void startElement(String arg0, String arg1, String arg2,
Attribute arg3) löst SAXException {
System.out.println("Elemente analysieren starten" + arg2);
if (arg3 != null) {
for (int i = 0; i < arg3.getLength(); i++) {
// getQName() soll den Attributnamen abrufen,
System.out.print(arg3.getQName(i) + „=/““ + arg3.getValue(i) + „/““);
}
}
System.out.print(arg2 + ":");
super.startElement(arg0, arg1, arg2, arg3);
}
}
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
öffentliche Klasse TestDemo {
public static void main(String[] args) löst eine Ausnahme aus {
// 1. Instanziieren Sie das SAXParserFactory-Objekt
SAXParserFactory Factory = SAXParserFactory.newInstance();
// 2. Erstellen Sie einen Parser
SAXParser parser = Factory.newSAXParser();
// 3. Rufen Sie das zu analysierende Dokument ab, generieren Sie einen Parser und analysieren Sie schließlich das Dokument
Datei f = neue Datei("books.xml");
SaxHandler dh = new SaxHandler();
parser.parse(f, dh);
}
}
Beginnen Sie mit dem Parsen der Elementbücher
Bücher:
Beginnen Sie mit dem Parsen des Elementbuchs
id="001"Buch:
Beginnen Sie mit dem Parsen des Elementtitels
Titel: Harry Potter
Parsing-Elementtitel beenden
Beginnen Sie mit dem Parsen des Elementautors
Autor: J K. Rowling
Parsing des Elementautors beenden
Beenden Sie das Parsen des Elementbuchs
Beginnen Sie mit dem Parsen des Elementbuchs
id="002"Buch:
Beginnen Sie mit dem Parsen des Elementtitels
Titel:XML lernen
Parsing-Elementtitel beenden
Beginnen Sie mit dem Parsen des Elementautors
Autor:Erik T. Ray
Parsing des Elementautors beenden
Beenden Sie das Parsen des Elementbuchs
Beenden Sie das Parsen von Elementbüchern
…………Parsing-Dokument beenden…………
Um diesen Prozess klarer auszuführen, können wir SaxHandler auch neu schreiben, um das ursprüngliche XML-Dokument wiederherzustellen
Überschriebene SaxHandler-Klasse:
öffentliche Klasse SaxHandler erweitert DefaultHandler {
@Override
öffentliche leere Zeichen (char[] arg0, int arg1, int arg2) löst eine SAXException { aus
System.out.print(new String(arg0, arg1, arg2));
super.characters(arg0, arg1, arg2);
}
@Override
public void endDocument() löst SAXException {
System.out.println("/n beendet das Parsen");
super.endDocument();
}
@Override
public void endElement(String arg0, String arg1, String arg2)
wirft SAXException {
System.out.print("</");
System.out.print(arg2);
System.out.print(">");
super.endElement(arg0, arg1, arg2);
}
@Override
public void startDocument() löst SAXException {
System.out.println("Parsing starten");
String s = "<?xml version=/"1.0/" binding=/"UTF-8/"?>";
System.out.println(s);
super.startDocument();
}
@Override
public void startElement(String arg0, String arg1, String arg2,
Attribute arg3) löst SAXException {
System.out.print("<");
System.out.print(arg2);
if (arg3 != null) {
for (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);
}
}
Es sieht jetzt viel besser aus und die Wiederherstellung veranschaulicht den Parsing-Prozess besser.