這裡有一個 XML 架構驗證類,摘自 。
//============================================================================================================
// Microsoft Updater Application Block for .Net
//
//
// SchemaValidator.cs
//
// Contains the implementation of the schema validator.
//
// For more information see the Updater Application Block Implementation OvervIEw.
//
//============================================================================================================
// Copyright ?Microsoft Corporation. All rights reserved.
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT
// LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE.
//============================================================================================================
using System;
using System.Collections;
using System.IO;
using System.XML;
using System.XML.Schema;
namespace Microsoft.ApplicationBlocks.Updater.UtilitIEs
{
/// <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
}
}
/// <summary>
/// Download and validates the manifest using the Uri location.
/// </summary>
/// <param name="type">The type that represents the manifest class.</param>
/// <param name="location">The location of the manifest.</param>
/// <param name="schemaResource">The resource where the embedded XSD resides in the assembly.</param>
/// <returns>The Manifest instance.</returns>
[SecurityPermission(SecurityAction.Demand, SerializationFormatter=true)]
private object ValidateAndDeserialize( Type type, Uri location, string schemaResource )
{
object result = null;
try
{
string doc = DownloadFile( location );
using ( Stream schema = Assembly.GetExecutingAssembly().GetManifestResourceStream( schemaResource ) )
{
SchemaValidator validator = new SchemaValidator( doc, schema );
if ( !validator.Validate() )
{
Logger.LogAndThrowException( new ApplicationUpdaterException( Resource.ResourceManager[ Resource.MessageKey.ManifestSchemaError, location, schemaResource ] ) );
}
XmlSerializer xser = new XMLSerializer( type );
result = xser.Deserialize( new XmlTextReader( doc, XMLNodeType.Document, null) );
}
}
catch( Exception ex )
{
Logger.LogAndThrowException( ex );
}
return result;
}