.NET Framework (wersja 2.0 wzwyż) używa obiektu klasy XmlReader do walidacji dokumentów Xml za pomocą schemy (XSD). Możliwe są dwa scenariusze takiej walidacji. W pierwszym scenariuszu jest wyrzucany wyjątek po napotkaniu w źródłowym dokumencie Xml pierwszej niezgodności ze schemą. Wówczas walidacja wygląda tak:
public static XmlDocument Validate()
{
XmlReaderSettings readerSettings =
new XmlReaderSettings();
readerSettings.ValidationType =
ValidationType.Schema;readerSettings.Schemas.Add
(null, "parts.xsd");
using(XmlReader xr =
XmlReader.Create("parts.xml", readerSettings))
{
/* while(xr.Read()) {} //walidacja bez ładowania
dokumentu do obiektu klasy XmlDocument */
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(xr);
return xmlDoc;
}
}
W drugim scenariuszu do xml readera przekazywany jest delegat (ang. delegate), który będzie wywołany za każdym razem kiedy źródłowy dokument Xml będzie niezgodny ze schemą. W przeciwieństwie do pierwszego scenariusza walidacja nie zostanie przerwana po napotkaniu pierwszego błędu lecz będzie kontynuowana aż cały dokument zostanie przeczytany. Poniższy kod pokazuje ten scenariusz walidacji:
public static XmlDocument Validate()
{
XmlReaderSettings readerSettings =
new XmlReaderSettings();
readerSettings.ValidationType =
ValidationType.Schema;readerSettings.Schemas.Add
(null, "parts.xsd");
readerSettings.ValidationEventHandler +=
new ValidationEventHandler(ValidationHandler);
using(XmlReader xr =
XmlReader.Create("parts.xml", readerSettings))
{
/* while(xr.Read()) {} //walidacja bez ładowania
dokumentu do obiektu klasy XmlDocument */
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(xr);
return xmlDoc;
}
}
public static void ValidationHandler(object sender,
ValidationEventArgs e)
{
Console.Out.WriteLine(e.Exception.Message);
}