Mittwoch, 30. Dezember 2009

Der Node-Reader unter VB.NET

Eine Möglichkeit mit .NET eine XML zu lesen ist der Node-Reader, so etwas wie der Jäger der verlorenen Knoten. Er bewegt sich tatsächlich linear von Knoten zu Knoten durch das Dokument.
Zuerst brauchen wir wieder eine gültige XML.

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<Programm>
  <Ordner>
   <Alter>120</Alter>
   <Suchmuster native="Datum">*.*</Suchmuster>
   <Ort id="23">d:\temp</Ort>
  </Ordner>
  <Ordner>
   <Alter>120</Alter>
   <Suchmuster native="Datum">*.*</Suchmuster>
   <Ort id="12">d:\temp</Ort>
  </Ordner>
</Programm>

Unsere Funktion erhält als Parameter den Dateinamen unserer XML-Datei. Danach initialisieren wir den NodeReader und laden das Dokument für die folgende Auswertung. Wir lesen mit der While-Schleife einen Knoten nach dem anderen und berücksichtigen nur interessante Knotentypen [NodeType = 1]. Kommentare und anderes lassen wir unberücksichtigt. Mit einem einfachen "Select Case" springen wir in die weitere Bearbeitung, nachdem wir den Namen des aktuellen Knoten ausgelesen haben [reader.Name].

Sub XMLLesen(ByVal Datei As String)

Dim InfoA, InfoB As String

'XmlNodeReader: Parser für DOM, die Welt besteht aus Knoten...
Dim doc As New XmlDocument : doc.Load(Datei)
Dim reader As XmlNodeReader : reader = New XmlNodeReader(doc)


While reader.Read
If reader.NodeType = 1 Then
    Select Case reader.Name
        Case "Alter"
            Try
                InfoA = reader.ReadInnerXml()
                Console.WriteLine(InfoA)
            Catch
                reader.Read()
            End Try
        Case "Suchmuster"
            Try
                InfoB = reader.GetAttribute("id").ToString()
                reader.Read()
                Console.WriteLine(InfoB)
            Catch
                reader.Read()
            End Try
        Case Else
            reader.Read()
    End Select
Else
    reader.Read()
End If
End While


Console.ReadKey()

End Sub

Der Node-Reader läuft linear von Knoten zu Knoten durch das gesamte Dokument. Natürlich müssen nicht alle Tags oder Attribute einer XML ausgewertet werden, man kann sich auf die Informationen beschränken, die man tatsächlich benötigt.

Wichtig bei dem Node-Reader ist es den Zeiger korrekt weiterzubewegen. Wird ein aktueller Knoten mit der Methode Objekt.ReadInnerXML() ausgelesen, wird der Zeiger automatisch weitergeschoben und verweist auf den nächsten Knoten. Wird hingegen ein Attribut mit der Methode Objekt.GetAttribute("xy") ausgelesen, dann wird der Zeiger nicht auf den nächsten Knoten geschoben. Dies muss explizit mit dem Aufruf Objekt.Read geschehen.

Keine Kommentare:

Kommentar veröffentlichen