这里有一个 XML 架构验证类,摘自 Microsoft Updater Application Block v2.0。
源码:
//============================================================================================================
// Microsoft Updater Application Block for .NET
// http://msdn.microsoft.com/library/en-us/dnbda/html/updater.asp
//
// 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
{
///
/// Helper class to perform schema validations.
///
public sealed class SchemaValidator
{
#region Private members
///
/// The schemas that will be used for validation.
///
private ArrayList schemas = new ArrayList(2);
///
/// The errors detected during the validation.
///
private ArrayList errors = new ArrayList(5);
///
/// Whether the document is valid or not.
///
private bool isValid;
#endregion
#region Constructors
///
/// Creates an instance of the SchemaValidator using the document and the schemas.
///
/// The document to validate.
/// A list of schemas to validate the document against.
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
///
/// Validates the document and returns the result of the validation.
///
///
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 { 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(); } } /// /// Contains the validation errors encountered in the last validation operation. /// public ValidationEventArgs[] Errors { get { return (ValidationEventArgs[])errors.ToArray(typeof(ValidationEventArgs) ); } } /// /// Helper method to capture the event handlers. /// /// The sender of the event. /// The information about the event. private void ValidationEventHandler(object sender, System.Xml.Schema.ValidationEventArgs e) { errors.Add( e ); if ( e.Severity == XmlSeverityType.Warning ) { return; } isValid = false; } #endregion } } 使用: /// /// Download and validates the manifest using the Uri location. /// /// The type that represents the manifest class. /// The location of the manifest. /// The resource where the embedded XSD resides in the assembly. /// [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; }

