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.