Wie man XML mit dem SAX-Parser analysiert
Ich bin nach dieser tutorial.
Es funktioniert Super, aber ich möchte es liefert ein array mit allen Zeichenfolgen anstelle von einer einzelnen Zeichenfolge, die das Letzte element.
Irgendwelche Ideen, wie dies zu tun?
InformationsquelleAutor der Frage Johan | 2011-01-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
So dass Sie bauen wollen, ein XML-parser zum Parsen eines RSS-Feeds wie dieser.
Nun haben Sie zwei SAX-Implementierungen, mit dem Sie arbeiten können. Entweder Sie nutzen die
org.xml.sax
oder dieandroid.sax
Umsetzung. Ich werde erklären, die pro 's und con' s der beiden nach der Veröffentlichung einer short-hander Beispiel.android.sax-Implementierung
Beginnen wir mit der
android.sax
Umsetzung.Müssen Sie zuerst definieren Sie die XML-Struktur mit der
RootElement
undElement
Objekte.In jedem Fall würde ich das arbeiten mit POJOs (Plain Old Java Objects), die Ihre Daten aufnehmen. Hier wäre die POJOs benötigt.
Channel.java
Diese Klasse implementiert die
Serializable
- Schnittstelle, so können Sie es in eineBundle
und tun etwas mit ihm.Nun brauchen wir eine Klasse unserer Produkte. In diesem Fall bin ich einfach nur zu erweitern, die
ArrayList
Klasse.Items.java
War es für unsere Einzelteile-container. Wir brauchen jetzt eine Klasse zu halten, die Daten für jedes einzelne Element.
Item.java
Beispiel:
Dass war jetzt ein sehr kurzes Beispiel wie man sehen kann. Der große Vorteil der Verwendung der
android.sax
SAX-Implementierung ist, dass Sie definieren die Struktur der XML-Datei, die Sie analysieren und dann einfach fügen Sie einen Ereignis-listener für die entsprechenden Elemente. Der Nachteil ist, dass der code Recht zu wiederholen und zu aufgebläht.org.xml.sax-Implementierung
Den
org.xml.sax
SAX-handler-implementation ist ein wenig anders.Hier müssen Sie nicht angeben, oder deklarieren Sie die XML-Struktur, sondern nur das hören für Veranstaltungen. Die am häufigsten verwendeten sind folgende Veranstaltungen:
Beispiel-handler-Implementierung mit dem Channel-Objekt sieht wie folgt aus.
Beispiel
Nun, um ehrlich zu sein kann ich nicht wirklich sagen, keinen echten Vorteil dieser handler-Implementierung in den
android.sax
. Aber ich kann Ihnen sagen, der Nachteil, das sollte ziemlich offensichtlich. Werfen Sie einen Blick auf die else if-Anweisung in derstartElement
Methode. Aufgrund der Tatsache, dass wir die tags<title>
link
unddescription
wir haben zu verfolgen, gibt es in der XML-Struktur, die wir im Augenblick sind. Das ist, wenn wir begegnen, ein<item>
Start-tag setzen wir dieinItem
Flagge zutrue
um sicherzustellen, dass wir die Karte die richtigen Daten zum richtigen Objekt und in derendElement
Methode setzen wir das flag auffalse
wenn wir auch eine</item>
tag. Zu signalisieren, dass wir fertig sind mit dieser item-tag.In diesem Beispiel ist es ziemlich einfach zu verwalten, aber mit zu Parsen einer komplexeren Struktur mit Hilfe von tags in verschiedenen Ebenen erweist sich als schwierig. Da müsstest du entweder Enums zum Beispiel, um den aktuellen Zustand und eine Menge von switch/case statemenets zu überprüfen, wo Sie sind, oder eine elegantere Lösung wäre eine Art tag-tracker mit ein-tag-stack.
InformationsquelleAutor der Antwort Octavian Damiean
In vielen Problemen ist es notwendig, um verschiedene Arten von xml-Dateien für verschiedene Zwecke. Ich werde nicht versuchen, die Unermesslichkeit zu begreifen und aus eigener Erfahrung sagen was ich alles brauche.
Java, vielleicht meine Lieblings-Programmiersprache. Darüber hinaus, diese Liebe wird gestärkt durch die Tatsache, dass Sie jedes problem lösen können und kommen mit dem Fahrrad ist nicht notwendig.
So, es hat mich zum erstellen einer Reihe von client-server mit einer Datenbank, die es dem AUFTRAGGEBER ermöglichen würden Remote zu machen, Einträge in den Datenbank-server. Unnötig zu prüfen, input-Daten, etc. und dergleichen, aber darum geht es nicht.
Als Prinzip der Arbeit, die ich, ohne zu zögern, entschied sich für die übertragung von Informationen in form von xml-Datei. Der folgenden Typen:
Machen es leichter, eine weitere zu Lesen, außer zu sagen, dass es die Informationen über ärzte Institutionen. Name, Vorname, eindeutige id, und so weiter. In der Regel die Daten-Serie. Diese Datei sicher hab auf der server-Seite, und starten Sie dann Parsen der Datei.
Der beiden Optionen parsing (SAX vs DOM), die ich wählte, SAX angesichts der Tatsache, dass er arbeitet mehr hell, und er war der erste, den ich in die Hände fiel 🙂
So. Wie Sie wissen, arbeiten erfolgreich mit dem parser, müssen wir überschreiben die benötigten Methoden DefaultHandler ist. Um zu beginnen, schließen Sie die benötigten Pakete.
Nun können wir mit dem schreiben beginnen unsere parser
Beginnen wir mit der Methode startDocument (). Er ist, wie der name schon sagt, reagiert auf ein Ereignis Anfang des Dokuments. Hier können Sie hängen eine Vielzahl von Maßnahmen wie zum Beispiel memory allocation oder zurücksetzen, um die Werte, aber unser Beispiel ist ziemlich einfach, so markieren Sie einfach den Anfang der Arbeit eine entsprechende Meldung:
Weiter. Der parser geht durch das Dokument mit dem element seiner Struktur. Beginnt die Methode startElement (). Und in der Tat, sein Auftritt: startElement (String namespaceURI, String localName, String qName, Attributes atts). Hier namespaceURI - namespace, localName der lokale name des Elements, qName - eine Kombination von lokaler name mit einem namespace (getrennt durch einen Doppelpunkt) und atts - die Attribute dieses Elements. In diesem Fall werden alle einfach. Es genügt, zu verwenden qName ' om und werfen es in einigen service-line thisElement. Damit wir markieren in dem das element, das wir im moment sind.
Nächsten, treffen wir Element seine Bedeutung. Hier sind Methoden-Zeichen (). Er hat die form: Zeichen (char [] ch, int start, int length). Auch hier ist alles klar. ch - a-Datei, welche die Zeichenkette enthalten sich-selbst-Bedeutung, die in diesem element. start und length - die Anzahl der service unter Angabe der Ausgangspunkt in der Linie und Länge.
Ah, ja. Hätte ich fast vergessen. Als das Objekt wird zu Falten naparsennye Daten spricht die Art der Ärzte. Diese Klasse definiert ist, und verfügt über alle notwendigen setter-Getter.
Nächste offensichtliche element endet und es folgt die nächste. Verantwortlich für das Ende der endElement (). Es signalisiert uns, dass die Sache beendet und Sie können alles tun in dieser Zeit. Wird fortgesetzt. Reinigen Element.
Kommen, so dass das gesamte Dokument, kommen wir an das Ende der Datei. Arbeit endDocument (). Wir können Speicher freizugeben, führen Sie einige diagnostichesuyu Druck, etc. In unserem Fall, nur über das schreiben, was das Parsen beendet.
Also haben wir eine Klasse zum Parsen von xml-unser format. Hier ist der vollständige text:
Ich hoffe das Thema geholfen zu leicht präsentieren die Essenz der SAX-parser.
Nicht streng beurteilen die ersten Artikel 🙂 ich hoffe, es war zumindest jemand nützlich.
UPD: Zum ausführen dieser parser, können Sie diesen code verwenden:
InformationsquelleAutor der Antwort Sergey Shustikov