DevTrain

Autor: Tobi Ulm

XML.NET Part 2: Der XMLReader -- BETA 2!!!

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

}

}


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