Geschrieben von: Christian Holm
Kategorie: ASP.NET
This printed page brought to you by AlphaSierraPapa
Der heutige Artikel befaßt sich mit der XMLNodeType Enumeration. Sie erfahren, was sich hinter diesem Namen verbirgt, und wie man programmatisch den Typ eines XML Nodes mittels ASP.NET auslesen kann.
Wie immer bei unseren ASP.NET Artikeln, ist zu beachten, daß Sie nur dann vom downloadbaren Sourcecode profitieren können, wenn Sie das Microsoft .NET Framework SDK auf einem Webserver installiert haben. Der präsentierte Sourcecode wurde mit der Version 1.0 des Microsoft .NET Framework SDK geschrieben.
Bevor ich Ihnen die Typen, die ein Node annehmen kann, vorstelle, möchte ich noch kurz erwähnen was ein XML Node ist. Mit Node meint man allgemein einen Knoten. Nicht einen, den man beim Schuhezubinden macht sondern eher geometrisch, wo z.B. Geraden zu einem Punkt zusammen laufen. Also bei einem Würfel die Ecke.
Ähnlich wie bei einem Drahtgittermodell in FEM ist nun ein Node ein Knotenpunkt oder Eintrag im Document tree, also der XML Dokument-Struktur bzw. Dokument-Hierarchie. Dieser ist die Basisklasse für den Datenzugriff des XML Document Model. Einem Node kann man wie einer Variable einen Typ zuweisen. Für Nodes gültige Typen sind entweder einfach nur Datentypen, Attribute, CDATA, Kommentare, Text oder sogar Namespaces oder auch DTD (Document Type Definition).
Die XMLNodeType Enumeration kann man quasi als Container für alle gültigen Nodetypen ansehen. Jedem Eintrag (Node) in einer XML Datei sollte man einen Typ zuweisen, um Fehler in der Darstellung zu vermeiden. Die Komplikationen ergeben sich meist wenn man Textpassagen eingibt, die Sonderzeichen enthalten. Diese würden ohne der Typdefintion CDATA fälschlicherweise als Teil des XML Sourcecodes interpretiert werden.
Wie kann man jetzt aber von einem vorhandenen XML Dokument den Typ der einzelnen Nodes erhalten? Dies werde ich Ihnen anhand eines kleinen Beispiels demonstrieren. Sie werden sich jetzt sicher fragen wozu das Ganze? Wenn ich ein XML Dokument erstelle, weiß ich sowieso welchen Typ ich verwendet habe. Aber: angenommen Sie wollen die Dateneingaben eines Clients in einem XML Dokument speichern, so können Sie nach der Eingabe den vorgegebenen Nodetype mit dem was der Client eingegeben hat, vergleichen, und so ungültige Eingaben vermeiden.
Die Ausgabe der Nodetypen habe ich mit Hilfe von ASP.NET realisiert. Das .NET Framework stellt innerhalb des XML Namespaces Methoden zur Verfügung, die eine große Hilfestellung sind. Das nun folgende Beispiel iteriert durch die Nodes und gibt am Browser den Namen und den Typ des Nodes als HTML formatierte Tabelle zurück.
Da hierbei das .NET Framework eine große Hilfestellung ist, ist nur wenig Sourcecode zur Lösung der Aufgabenstellung notwendig. Sehen wir uns also den benötigten Sourcecode schrittweise an (XmlNType.aspx).
String XmlFile = @"G:\LocalSites\TestRoot\ASPX\currentarticles.xml";
Zuerst müssen wir natürlich die XML Datei bekannt geben, aus der wir die Nodetypen erfassen möchten. Den vollständigen Pfad samt Dateinamen mit Erweiterung speichern wir der Einfachheit halber in einer Variable namens XmlFile, vom Datentyp String.
Wenn Sie jedoch statt einem lokalen Pfad einen URL angeben wollen, so ist das auch kein Problem (die existiert, also probieren Sie es ruhig aus!):
string XmlFile = @"http://www.aspheute.com/currentarticles.xml";
Wir geben also einfach den vollständigen URL an. Als nächstes müssen wir ein neues XmlDocument Objekt erstellen, dem wir dem Namen MyXmlDoc geben:
XmlDocument MyXmlDoc = new XmlDocument(); MyXmlDoc.Load(XmlFile);
Anschließend laden wir die XML Datei, deren Pfad bzw. URL wir vorher in der Variable XmlFile gespeichert haben.
Nun wollen wir den Namen und Node Type ausgeben. Dies habe ich mit der selbst verfaßten Methode GetChildAttrib realisiert. Um das Ergebnis leichter formatieren und lesbar zu machen, habe ich den Output wie schon erwähnt in einer HTML Tabelle verpackt. Das Grundgerüst der Tabelle umgibt den Call der Methode.
Response.Write("<table cellpadding=\"2\" cellspacing=\"2\" border=\"1\">"); Response.Write("<th>Name</th><th>NodeType</th>"); GetChildAttrib(MyXmlDoc.DocumentElement); Response.Write("</table>");
Sehen wir uns nun die Methode GetChildAttrib, welche den Namen und den Type jedes im Dokument enthaltenen Nodes zurückgibt, an:
void GetChildAttrib(XmlNode node) { for (int i = 0; i < node.ChildNodes.Count; i++) { Response.Write("<tr><td>" + node.ChildNodes[i].Name + "</td>"); Response.Write("<td>" + node.ChildNodes[i].NodeType + "</td></tr>"); GetChildAttrib(node.ChildNodes[i]); } }
GetChildAttrib Methode iteriert mit einer for-Schleife durch die einzelnen Nodes bis sie beim letzten angelangt ist - der letzte Node ist die Anzahl in node.ChildNodes.Count und liefert den Namen und den Node Typ zurück.
Den Namen des Nodes erhält man durch die Name Property (Eigenschaft) der XMLNode Members:
... node.ChildNodes[i].Name ...
Den Node Typ als ausgeschriebenes Wort erhält man durch die NodeType Property der XMLNode Members:
... node.ChildNodes[i].NodeType ...
So, nun ist der Sourcecode fertig. Wenn wir also die Datei XmlNType.aspx auf einem ASP.NET-ready Web Server ausführen und in einem Browser betrachten, sieht das dann so aus:
Die verwendete XML-Datei im Browser:
Der Vergleich unseres ASP.NET Codes mit der farbigen Darstellung des XSLT Stylesheets von Internet Explorer "hinkt" zwar etwas, aber: unser Code erlaubt es sehr einfach, ein XML Dokument auf korrekte Typen hin zu debuggen. Und wer schon einmal Probleme mit XML Dokumenten hatte, weiß, daß diese Fehlersuche manchmal zum Haareraufen sein kann. Daher ist unsere "Type-Viewer" ein äußerst nützliches Tool für den beinahe-täglichen Gebrauch.
Dieser Artikel war ein (sehr) kurzer Einblick in den XML Namespace des .NET Frameworks, mit dessen Hilfe Sie unter anderem den Typ jedes Nodes eines XML Dokuments erhalten. Es gibt noch viel mehr zu entdecken - wir lesen uns wieder!
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20010216.zip
©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.