DevTrain

Autor: Hannes Preishuber

XML Lesen mit XMLTextReader

In der bisherigen XML Welt gibt es offiziell nur zwei Methoden um auf XML Files zuzugreifen. DOM und SAX. In der Praxis wurde aber aus Performance und Kostengründen auch oft nur per direkten Filezugriff XML gelesen und besonders geschrieben. In DOT NET wurde diesem Trend Rechnung getragen.

Mit XMLTextReader können Daten aus einem Stream vorwärts gelesen werden. Eine Navigation und das Schreiben ist folglich nicht möglich.

Geprüft wird nur auf wohlgeformheit aber nicht auf validität. Deshalb ist dies die schnellste Methode Daten zu lesen. Wenn gegen ein Schema oder DTD validierert werden soll steht der XMLValidatingReader zur verfügung.
Um XML Daten in ein DOM einzulesen wird die Klasse XMLDocument verwendet. Darin kann wieder über den XMLNodeReader auf Nodes zugegriffen werden.

Der XMLtextReader wird mit dem physikalischen Pfad instaziert. Bei ASP .NET wird mit Server.Mappath aus dem virtuellen ein echtes Verzeichnis. Über Read wird von Knoten zu Knoten gesprungen. Über die Eigenschaft Name wird dann der Name des Knotens (Elements) zurückgegben.

Dim rd As XmlTextReader = New XmlTextReader(Server.MapPath("../poll.xml"))
rd.read
Response.Write(rd.Name + ":" + rd.Value + "<br>")

 Zur ersten Analyse nehmen wir uns das poll.xml vor aus dem Vote Control. 
xml

Poll

Question

Question

Choices

a

a

b

b

c

c

d

d

Choices

Poll

Beachten Sie, das Leerzeilen erscheinen. Auch das Ende eines Elements ist für den Reader ein Knoten.

Unsere Aufgabe ist es nun die Daten aus Poll.XML in einem Webform darzustellen.

<?xml version="1.0" encoding="utf-8" ?>
<Poll name="Wichtig"
      connectionAppSettingKey="DBCon" >
 <Question>Wieviel Seiten drucken Sie monatlich</Question>
 <Choices>
  <a>weniger als 100</a>
  <b>zwischen 100 und 1000</b>
  <c>Mind. 1000</c>
  <d>weiss ich nicht</d>
 </Choices>
</Poll>

Zur Anzeige werden Textboxen und ein Listbox verwendet. Jeder Knoten wird anhand seines Namens identifiziert und unterschiedlich behandelt.
Bei dem Element Poll sind Attribute beinhaltet, die über den Index des Readers angesprochen werden können. Bei einem Element muss ein weiterer Read durchgeführt werden um auf den Text zu kommen. Der Wert wird über das Proberty Value ausgelesen. (Element->Text->EndElement)
Die letzte Hürde ist es die Auswahlliste zu füllen. Diese wird im XML File im Element Choices mit Child Elmenten beginnend bei "A" gespeichert. Um die Text Elemente zu erkennen wird nach dem Auftreten eines des Elements Choices eine eigener Read Loop angestossen und jeweils auf den Nodetype geprüft. Wenn der Typ text ist, handelt es sich wohl um den nächsten Wert.

if Not IsPostBack() Then
   Dim rd As XmlTextReader = New XmlTextReader(Server.MapPath("../poll.xml"))
   While rd.Read()
     Select Case rd.Name
        Case "Poll"
            txtPoll.Text = rd(0)
        Case "Question"
            If txtFrage.Text = "" Then
             rd.Read()
  txtFrage.Text = rd.Value
            End If
        Case "Choices"
            While rd.Read()
              If rd.NodeType = XmlNodeType.Text Then
                lstOption.Items.Add(rd.Value)
              End If
            End While
        End Select
  End While
End If

Sinnvollerweise tun Sie das im PageLoad. Dort aber sollten Sie auf eine Postback prüfen um nur beim GET eine Laden durchzuführen.
Wenn Sie den Reader nicht schliessen, können Sie später nicht mehr in das File schreiben. Das leigt daran, das dann die Garbage Collection das Objekt nicht mehr frühzeitig freigibt und damit die Datei noch im Zugriff liegt. Vergessen Sie also nicht rd.close.

 

 


Erfasst am: 15.05.2002 - Artikel-URL: http://www.devtrain.de/news.aspx?artnr=768
© Copyright 2003 ppedv AG - http://www.ppedv.de