Im letzten Artikel haben wir uns auf die XMLWriter und die dazugehörige XMLTextWriter Klasse beschränkt und damit ein kleines XML Dokument erzeugt. Wir bauen dieses kleine Beispiel heute aus und werden das erzeugte XML Dokument auf einer weiteren .aspx Seite mit dem XMLTextReader öffnen.
Die XMLReader Klasse sieht auf den ersten Blick wie eine SAX Implementation aus, ist sie aber nicht. Sie ist vielmehr eine Mischung aus DOM und SAX und kann mit einem, aus ADO bekannten Vorwärts / nur Lese Cursor verglichen werden. Genauso wie die XMLWriter Klasse handelt es sich hierbei um eine abstrakte Klasse, die durch mehrere Konstruktoren auf verschiedene Wege Eingabeströme verarbeiten kann. URI Strings, Streamreader Typen und TextReader Typen.
Die konkrete Implementierung ist die XMLTextReader Klasse welche von der XMLReader Klasse abgeleitet wird. Es gibt in Beta 2 eine neue konkrete Klasse die nur für die Valdierung zuständig ist (XmlValidatingReader) und Validierung gegen DTD's und XML Schemas unterstützt und kann über die Validation Eigenschaft auf DTD, XML Schema oder auf NONE bzw. AUTO gesetzt werden. Der Reader erkennt dabei ob es sich um ein DTD oder ein Schema handelt. Im QuellCode sehen Sie, dass ich die ValidationEventHandler Eigenschaft auf die Funktion ValidationCallBack() Methode setze. In dieser Methode, die sie selber erzeugen müssen,  haben Sie die Möglichkeit auf Vailidierungsereignisse zu reagieren.
Die Read() Methode trifft nicht auf AttributKnoten, da diese ausserhalb der bertrachteten hierarchischen Dokumentenstruktur liegen. Die Attritbute werden als Metadaten angesehen und deren Werte können bei einem Element mit der GetAttributes Funktion durch Indizes abgerufen werden.
        |             using System;       using  System.Collections;      using  System.ComponentModel;      using  System.Data;      using  System.Drawing;      using  System.Web;      using  System.Web.SessionState;      using  System.Web.UI;      using  System.Web.UI.WebControls;      using  System.Web.UI.HtmlControls;      using  System.Xml;      using  System.Xml.Schema;      namespace  WebApp1      {       ///       <summary>      ///       Summary description for XMLReader.      ///       </summary>      public       class XMLReader :       System.Web.UI.Page      {       bool valError =       false;      public       XMLReader()      {       Page.Init +=  new       System.EventHandler(Page_Init);      }       private       void       Page_Load(object       sender, System.EventArgs e)      {       // Put user code to initialize the       page here      if       (!IsPostBack)      {       string myXML =       Request.QueryString["XMLDoc"].ToString();      Response.Write("Name des XML Docs: " + myXML + "<br>");       string AppPath =       AppDomain.CurrentDomain.BaseDirectory.Substring(7,       AppDomain.CurrentDomain.BaseDirectory.Length -7);      AppPath = AppPath.Substring(1, AppPath.Length -1);       //Erzeugen eines neuen XMLTextReader       Objekts      XmlTextReader myReader =  new XmlTextReader(AppPath + myXML);      //Validierung auf XML Schema       setzen      XmlValidatingReader vr =  new XmlValidatingReader(myReader);      try      {       while       (myReader.Read())      {       //Der EventHandler für die       Validierung      vr.ValidationEventHandler +=  new       ValidationEventHandler(ValidationCallBack);      if (!valError)      {       Response.Write("<font color='green'>Document is       valid!</font>");       }       InspectCurrentNode(myReader);       }       }       catch       (XmlException d)      {       Response.Write("<font color='red'>Error: " + d.Message.ToString()       + "</font>");       }       }       }       private       void       InspectCurrentNode(XmlTextReader reader)      {       string strQName =       reader.Name;//Auslesen des aktuellen       Nodenamens inklusive des Namespace Prefixes      string       strLocalName = reader.LocalName;//Auslesen des aktuellen Nodenamens      string strNSURI =       reader.NamespaceURI;//Auslesen der       Namespace URN      if       (reader.NodeType == XmlNodeType.Comment) // Ist der aktuelle Node ein Kommentar?      {       Response.Write("[comment] " + reader.Value + "<br>"); //Auslesen des Kommentar Wertes      }       if       (reader.NodeType == XmlNodeType.EndElement) //Aktueller Node ein Ende Tag      {       Response.Write("[EndElement] " + strLocalName + "<br>");       }       if       (reader.NodeType == XmlNodeType.Element)//Aktueller Node eine Start Element      {       XmlNodeType type = reader.NodeType;  //Art des Nodes      string strValue =       reader.Value; //Auslesen des Node       Wertes      bool bAtts =       reader.HasAttributes;//Hat der Node       Attribute      int countAtts =       reader.AttributeCount;//Wieviele       Attribute hat der Node      Response.Write("[ElementStart] " + strLocalName + "<br>");       if (bAtts)      {       Response.Write("Node has attributes: " + bAtts + "<br>");       Response.Write("# of attributes: " + countAtts +       "<br>"); //Anzahl der Attribute des       aktuellen Nodes      for (int i=0;i       <=countAtts-1;i++)//Iteration durch       die Attribute des aktuellen Nodes      {       Response.Write("value of attribute " + ( i + 1) +" :" +       reader.GetAttribute(i) + "<br>"); //Auslesen des Attribut Wertes      }       }       if(strValue !=       "")      {       Response.Write("nodevalue: " + strValue + "<br>");       }       }       if       (reader.NodeType == XmlNodeType.Attribute)      {       Response.Write("name of attribute: " + reader.LocalName);       Response.Write("value of attribute: " + reader.Value);       }       if       (reader.NodeType == XmlNodeType.Text)      {       Response.Write("element value: " + reader.Value + "<br>");       }       }       public       void       ValidationCallBack(object obj, ValidationEventArgs args)      {       valError =  true;      Response.Write("<font color='red'>Dieses XML Dokument ist nicht       valid!" + args.Message.ToString() +"</font>");       }       private       void       Page_Init(object       sender, EventArgs e)      {       //      // CODEGEN: This call is required by       the ASP.NET Web Form Designer.      //      InitializeComponent();       }       #region  Web Form Designer generated code      ///       <summary>      ///       Required method for Designer support - do not modify      ///       the contents of this method with the code editor.      ///       </summary>      private       void       InitializeComponent()      {        this.Load +=       new       System.EventHandler(this.Page_Load);      }       #endregion       }       }  |