XML Schema Validator Class
这里有一个 XML 架构验证类,摘自 Microsoft Updater Application Block v2.0。
using System;
using System.Collections;
using System.IO;
using System.Xml;
using System.Xml.Schema;
namespace RapidTier
{
/// <summary>
/// Helper class to perform schema validations.
/// </summary>
public sealed class SchemaValidator
{
#region Private members
/// <summary>
/// The schemas that will be used for validation.
/// </summary>
private ArrayList schemas = new ArrayList(2);
/// <summary>
/// The errors detected during the validation.
/// </summary>
private ArrayList errors = new ArrayList(5);
/// <summary>
/// Whether the document is valid or not.
/// </summary>
private bool isValid;
#endregion
#region Constructors
/// <summary>
/// Creates an instance of the SchemaValidator using the document and the schemas.
/// </summary>
/// <param name="document">The document to validate.</param>
/// <param name="schemas">A list of schemas to validate the document against.</param>
public SchemaValidator( string document, params Stream[] schemas )
{
this.schemas.Add( document );
foreach(Stream s in schemas)
{
this.schemas.Add( s );
}
isValid = true;
}
#endregion
#region Public members
/// <summary>
/// Validates the document and returns the result of the validation.
/// </summary>
/// <returns><c>true</c> if the document have succeeded the validation, otherwise <c>false</c>.</returns>
public bool Validate()
{
errors.Clear();
XmlValidatingReader vr = null;
object doc = schemas[0];
if ( doc is Stream)
{
vr = new XmlValidatingReader( (Stream)doc, XmlNodeType.Element, null );
}
else if ( doc is String )
{
vr = new XmlValidatingReader( (string)doc, XmlNodeType.Element, null );
}
try
{
for(int i=1;i<schemas.Count;i++)
{
vr.Schemas.Add( null, new XmlTextReader( (Stream)schemas[i] ) );
}
vr.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(ValidationEventHandler);
while( vr.Read() );
return isValid;
}
finally
{
vr.Close();
}
}
/// <summary>
/// Contains the validation errors encountered in the last validation operation.
/// </summary>
public ValidationEventArgs[] Errors
{
get
{
return (ValidationEventArgs[])errors.ToArray(typeof(ValidationEventArgs) );
}
}
/// <summary>
/// Helper method to capture the event handlers.
/// </summary>
/// <param name="sender">The sender of the event.</param>
/// <param name="e">The information about the event.</param>
private void ValidationEventHandler(object sender, System.Xml.Schema.ValidationEventArgs e)
{
errors.Add( e );
if ( e.Severity == XmlSeverityType.Warning )
{
return;
}
isValid = false;
}
#endregion
}
}
using System.Collections;
using System.IO;
using System.Xml;
using System.Xml.Schema;
namespace RapidTier
{
/// <summary>
/// Helper class to perform schema validations.
/// </summary>
public sealed class SchemaValidator
{
#region Private members
/// <summary>
/// The schemas that will be used for validation.
/// </summary>
private ArrayList schemas = new ArrayList(2);
/// <summary>
/// The errors detected during the validation.
/// </summary>
private ArrayList errors = new ArrayList(5);
/// <summary>
/// Whether the document is valid or not.
/// </summary>
private bool isValid;
#endregion
#region Constructors
/// <summary>
/// Creates an instance of the SchemaValidator using the document and the schemas.
/// </summary>
/// <param name="document">The document to validate.</param>
/// <param name="schemas">A list of schemas to validate the document against.</param>
public SchemaValidator( string document, params Stream[] schemas )
{
this.schemas.Add( document );
foreach(Stream s in schemas)
{
this.schemas.Add( s );
}
isValid = true;
}
#endregion
#region Public members
/// <summary>
/// Validates the document and returns the result of the validation.
/// </summary>
/// <returns><c>true</c> if the document have succeeded the validation, otherwise <c>false</c>.</returns>
public bool Validate()
{
errors.Clear();
XmlValidatingReader vr = null;
object doc = schemas[0];
if ( doc is Stream)
{
vr = new XmlValidatingReader( (Stream)doc, XmlNodeType.Element, null );
}
else if ( doc is String )
{
vr = new XmlValidatingReader( (string)doc, XmlNodeType.Element, null );
}
try
{
for(int i=1;i<schemas.Count;i++)
{
vr.Schemas.Add( null, new XmlTextReader( (Stream)schemas[i] ) );
}
vr.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(ValidationEventHandler);
while( vr.Read() );
return isValid;
}
finally
{
vr.Close();
}
}
/// <summary>
/// Contains the validation errors encountered in the last validation operation.
/// </summary>
public ValidationEventArgs[] Errors
{
get
{
return (ValidationEventArgs[])errors.ToArray(typeof(ValidationEventArgs) );
}
}
/// <summary>
/// Helper method to capture the event handlers.
/// </summary>
/// <param name="sender">The sender of the event.</param>
/// <param name="e">The information about the event.</param>
private void ValidationEventHandler(object sender, System.Xml.Schema.ValidationEventArgs e)
{
errors.Add( e );
if ( e.Severity == XmlSeverityType.Warning )
{
return;
}
isValid = false;
}
#endregion
}
}