Das Englische Originaltutorial.
Die XmlSax Library enthält einen XML Sax Parser (deutsch) Sax parser (englisch).
Der Parser liest sequentiell den Strom (stream) und löst Events am Anfang und am Ende von jedem Element aus
Der Entwickler ist dafür verantwortlich, die Events zu verarbeiten.
Es gibt zwei Events:
Das StartElement Event wird ausgelöst wenn ein Element anfängt. Das Event beinhaltet die Liste der Attribute der Elements.
EndElement wird ausgelöst wenn ein Element endet. Dieses Event enthält den Text des Elements.
In diesem Beispiel werden wir das Forum RSS Feed analysieren. RSS ist mit XML formatiert.
Ein vereinfachtes Beispiel von diesem RSS ist:
Die erste Zeile ist ein Teil des XML Protokolls und wird ignoriert.
In der zweiten Zeile wird das StartElement Event ausgelöst mit "Name = rss" und die Attribute enthalten das "version" Feld.
Das EndElement Event von dem rss Element wird erst in der letzen Zeile ausgelöst: </rss>.
Wir werden eine ListView mit allen analysierten Elementen von einer offline Datei füllen. Wenn der Benutzer auf einen Eintrag klickt, öffnen wir den Browser mit dem relevanten Link.
Jeder Eintrag entspricht einem Forum Thread.
Für jeden Eintrag sind wir in zwei Werten interessiert. Der Titel und den Link.
Das SAXParser Objekt enthält eine praktische Liste, die die Namen aller aktuellen Eltern-Elemente enthält.
Dies ist nützlich, da es uns helfen wird, die 'richtigen' 'title' und 'link ' Elemente zu finden. Die richtigen Elemente sind die unter dem 'item' Element.
Der Parsing-Code ist in diesem Fall ziemlich einfach:
Title und Link sind globale Variablen.
Wir benutzen nur EndElement Events in diesem Programm.
Zuerst überprüfen wir ob wir in einem 'item' Element sind. Wenn dies der Fall ist, überprüfen wir den aktuellen Elementnamen und speicher ihn wenn es ein 'title' oder ein 'link' ist.
Wenn das aktuelle Element ein 'item' ist, bedeutet das daß wir mit der Analyse des 'item' fertig sind. Und wir fügen die zwischengespeicherten Daten in die ListView.
Wir benutzen ListView.AddSingleLine2. Diese Methode bekommt 2 Werte. Der Erste ist der Text des 'item' und der zweite ist der Wert der zurückgegeben wird wenn der Benutzer auf diesen Eintrag klickt. In diesem Fall speichern den Link als Rückgabewert.
Später werden ihn zum öffnen des Browsers benutzen:
Der Code der die Analyse eingeleitet hat:
Programm:
XmlSax.zip
Die XmlSax Library enthält einen XML Sax Parser (deutsch) Sax parser (englisch).
Der Parser liest sequentiell den Strom (stream) und löst Events am Anfang und am Ende von jedem Element aus
Der Entwickler ist dafür verantwortlich, die Events zu verarbeiten.
Es gibt zwei Events:
B4X:
StartElement (Uri As String, Name As String, Attributes As Attributes)
EndElement (Uri As String, Name As String, Text As StringBuilder)
EndElement wird ausgelöst wenn ein Element endet. Dieses Event enthält den Text des Elements.
In diesem Beispiel werden wir das Forum RSS Feed analysieren. RSS ist mit XML formatiert.
Ein vereinfachtes Beispiel von diesem RSS ist:
B4X:
<?xml version="1.0" encoding="ISO-8859-1"?>
<rss version="2.0">
<channel>
<title>Basic4ppc / Basic4android - Android programming</title>
<link>http://www.b4x.com/forum</link>
<description>Basic4android - android programming and development</description>
<ttl>60</ttl>
<image>
<url>http://www.b4x.com/forum/images/misc/rss.jpg</url>
<title>Basic4ppc / Basic4android - Android programming</title>
<link>http://www.b4x.com/forum</link>
</image>
<item>
<title>Phone library was updated - V1.10</title>
<link>http://www.b4x.com/forum/additional-libraries-official-updates/6859-phone-library-updated-v1-10-a.html</link>
<pubDate>Sun, 12 Dec 2010 09:27:38 GMT</pubDate>
<guid isPermaLink="true">http://www.b4x.com/forum/additional-libraries-official-updates/6859-phone-library-updated-v1-10-a.html</guid>
</item>
...MORE ITEMS HERE
</channel>
</rss>
In der zweiten Zeile wird das StartElement Event ausgelöst mit "Name = rss" und die Attribute enthalten das "version" Feld.
Das EndElement Event von dem rss Element wird erst in der letzen Zeile ausgelöst: </rss>.
Wir werden eine ListView mit allen analysierten Elementen von einer offline Datei füllen. Wenn der Benutzer auf einen Eintrag klickt, öffnen wir den Browser mit dem relevanten Link.
Jeder Eintrag entspricht einem Forum Thread.
Für jeden Eintrag sind wir in zwei Werten interessiert. Der Titel und den Link.
Das SAXParser Objekt enthält eine praktische Liste, die die Namen aller aktuellen Eltern-Elemente enthält.
Dies ist nützlich, da es uns helfen wird, die 'richtigen' 'title' und 'link ' Elemente zu finden. Die richtigen Elemente sind die unter dem 'item' Element.
Der Parsing-Code ist in diesem Fall ziemlich einfach:
B4X:
Sub Parser_StartElement (Uri As String, Name As String, Attributes As Attributes)
End Sub
Sub Parser_EndElement (Uri As String, Name As String, Text As StringBuilder)
If parser.Parents.IndexOf("item") > -1 Then
If Name = "title" Then
Title = Text.ToString
Else If Name = "link" Then
Link = Text.ToString
End If
End If
If Name = "item" Then
ListView1.AddSingleLine2(Title, Link) 'add the title as the text and the link as the value
End If
End Sub
Wir benutzen nur EndElement Events in diesem Programm.
Zuerst überprüfen wir ob wir in einem 'item' Element sind. Wenn dies der Fall ist, überprüfen wir den aktuellen Elementnamen und speicher ihn wenn es ein 'title' oder ein 'link' ist.
Wenn das aktuelle Element ein 'item' ist, bedeutet das daß wir mit der Analyse des 'item' fertig sind. Und wir fügen die zwischengespeicherten Daten in die ListView.
Wir benutzen ListView.AddSingleLine2. Diese Methode bekommt 2 Werte. Der Erste ist der Text des 'item' und der zweite ist der Wert der zurückgegeben wird wenn der Benutzer auf diesen Eintrag klickt. In diesem Fall speichern den Link als Rückgabewert.
Später werden ihn zum öffnen des Browsers benutzen:
B4X:
Sub ListView1_ItemClick (Position As Int, Value As Object)
StartActivity(PhoneIntents1.OpenBrowser(Value)) 'open the brower with the link
End Sub
B4X:
Dim in As InputStream
in = File.OpenInput(File.DirAssets, "rss.xml") 'This file was added with the file manager.
parser.Parse(in, "Parser") '"Parser" is the events subs prefix.
in.Close