1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
using System;
using System.Collections;
using System.Collections.Specialized;
using System.Xml;
using System.Xml.Schema;
namespace Commons.Xml.Nvdl
{
public class NvdlXsdValidatorProvider : NvdlValidationProvider
{
public override NvdlValidatorGenerator CreateGenerator (
XmlReader reader, NvdlConfig config)
{
if (reader.NamespaceURI != XmlSchema.Namespace)
return null;
ArrayList al = new ArrayList ();
while (!reader.EOF) {
if (reader.NodeType != XmlNodeType.Element) {
reader.Read ();
continue;
}
reader.MoveToContent ();
XmlSchema xs = XmlSchema.Read (reader, null);
xs.Compile (null, config.XmlResolverInternal);
al.Add (xs);
reader.Read ();
}
return new NvdlXsdValidatorGenerator (al.ToArray (typeof (XmlSchema)) as XmlSchema []);
}
}
internal class NvdlXsdValidatorGenerator : NvdlValidatorGenerator
{
XmlSchema [] schemas;
public NvdlXsdValidatorGenerator (XmlSchema [] schemas)
{
this.schemas = schemas;
}
public override XmlReader CreateValidator (XmlReader reader,
XmlResolver resolver)
{
XmlReaderSettings s = new XmlReaderSettings ();
s.ValidationType = ValidationType.Schema;
// do not allow inline schema and schemaLocation.
s.ValidationFlags = XmlSchemaValidationFlags.ProcessIdentityConstraints;
s.XmlResolver = resolver;
foreach (XmlSchema schema in schemas)
s.Schemas.Add (schema);
return XmlReader.Create (reader, s);
}
public override bool AddOption (string name, string arg)
{
return false;
}
public override bool HandleError (Exception ex, XmlReader reader, string nvdlLocation)
{
if (ex is XmlSchemaException)
throw new NvdlInstanceValidationException (String.Format ("XML schema validation error occured as a part of NVDL validation."), ex, this, nvdlLocation);
return false;
}
}
}
|