Android Tutorial XML Parsing mit der XmlSax Library

klaus

Expert
Licensed User
Longtime User
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:

B4X:
StartElement (Uri As String, Name As String, Attributes As Attributes)
EndElement (Uri As String, Name As String, Text As StringBuilder)
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:

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>
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.

xmlsax_1.png


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
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:

B4X:
Sub ListView1_ItemClick (Position As Int, Value As Object)
    StartActivity(PhoneIntents1.OpenBrowser(Value)) 'open the brower with the link
End Sub
Der Code der die Analyse eingeleitet hat:
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
Programm:
zip.gif
XmlSax.zip
 
Top