When you load the XmlDocument using a validating reader, at load time we set
the Schemas property of the XmlDocument to be the same as that of the
XmlReaderSettings object with which the validating reader was created. That
is why you commented code does not throw an exception.
But when you do not load the XmlReaderSettings object with the schemas, then
the validating reader will create its local schema set from schema locations
parsed in the xml (if the XmlSchemaValidationFlags.ProcessSchemaLocation is
set, as it is in your example) and use this for validation.
Since this schema set is not set back onto the reader settings object (as
you might be creating multiple readers using the same reader settings), the
xml document does not have access to the schemas that the reader loaded.
Hope that explains the behavior below. For XmlDocument.Validate(),
ProcessSchemaLocation, ProcessInlineSchema flags are turned off by default
and there is currently no public way to set them.
Thanks,
Priya
"dlutz" <dlutz@nospam.emailwrote in message
news:urHZj4PsGHA.1304@TK2MSFTNGP06.phx.gbl...
Quote:
Hello to all --
>
I am familiar with Xml in general and NET 1.1 Xml, but I am new to the
.NET 2.0 changes in System.Xml.
>
I am trying to validate an XML document that is based on a schema that
imports several other schemas.
I am using VS2005 and .NET 2.0 on Windows 2003 Server with SP1.
I am using the Validate method of the XmlDocument class. I am passing
in an instance of XmlReader.
>
My code is as follows (I'll explain the commented code in a second):
>
XmlDocument xd = new XmlDocument();
XmlReaderSettings readerSettings = new XmlReaderSettings();
//XmlSchemaSet schemaSet = new XmlSchemaSet();
XmlUrlResolver resolver = new XmlUrlResolver();
>
>
//schemaSet.Add("http://co.marin.ca.us/ComplaintRequestDocument/1.0",
"I10\\ComplaintRequest.xsd");
//schemaSet.Add("http://www.it.ojp.gov/jxdm/3.0.2",
"I10\\jxdm\\3.0.2\\jxdm.xsd");
//schemaSet.Add("http://www.it.ojp.gov/jxdm/3.0.2/proxy/ncic_2000/1.0.1",
"I10\\jxdm\\3.0.2\\proxy\\ncic_2000\\1.0.1\\ncic_2 000.xsd");
//schemaSet.Add("http://www.it.ojp.gov/jxdm/3.0.2/proxy/usps_states/1.0",
"I10\\jxdm\\3.0.2\\proxy\\usps_states\\1.0\\usps_s tates.xsd");
//schemaSet.Add("http://www.it.ojp.gov/jxdm/3.0.2/proxy/xsd/1.0",
"I10\\jxdm\\3.0.2\\proxy\\xsd\\1.0\\xsd.xsd");
//schemaSet.Add("http://www.it.ojp.gov/jxdm/ncic_2000/1.0.1",
"I10\\jxdm\\ncic_2000\\1.0.1\\ncic_2000.xsd");
//schemaSet.Add("http://www.it.ojp.gov/jxdm/usps_states/1.0",
"I10\\jxdm\\usps_states\\1.0\\usps_states.xsd" );
//readerSettings.Schemas = schemaSet;
>
readerSettings.ValidationType = ValidationType.Schema;
readerSettings.ValidationFlags |=
(XmlSchemaValidationFlags.ProcessSchemaLocation);
readerSettings.CloseInput = true;
readerSettings.IgnoreComments = true;
System.Net.NetworkCredential creds = new
System.Net.NetworkCredential("Administrator", <<PWD>>", "<<LOCAL MACHINE
NAME>>");
resolver.Credentials = creds;
readerSettings.XmlResolver = resolver;
XmlReader xr = XmlReader.Create(new
StringReader(xmlDoc.DocumentElement.OuterXml), readerSettings,
parserContext);
xd.Load(xr);
ValidationEventHandler eventHandler = new
ValidationEventHandler(ValidationEventHandler);
xd.Validate(eventHandler);
>
As soon as I hit the last line during debugging, I get the follow
exception:
>
System.InvalidOperationException was unhandled
Message="The XmlSchemaSet on the document is either null or has no
schemas in it. Provide schema information before calling Validate."
Source="System.Xml"
StackTrace:
at System.Xml.XmlDocument.Validate(ValidationEventHan dler
validationEventHandler, XmlNode nodeToValidate)
at System.Xml.XmlDocument.Validate(ValidationEventHan dler
validationEventHandler)
at BizTalkAlternatives.InsertCompReqXmlTest.Main(Stri ng[] args) in
C:\Documents and Settings\dlutz\My Documents\Visual Studio
2005\Projects\BizTalkAlternatives\InsertCompReqXml Test\InsertCompReqXmlTest.cs:line
60
at System.AppDomain.nExecuteAssembly(Assembly assembly, String[]
args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence
assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.Run UsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context( Object state)
at System.Threading.ExecutionContext.Run(ExecutionCon text
executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
>
From what I have been able to read about System.Xml in .NET 2.0, I
expected the validator to resolve the schemaLocation attributes (which use
relative paths) and use them to validate the document. However, that is
not what happens. What I am missing here?
Finally, if I uncomment the code lines above where I add the schemas to
the XmlSchemaSet, all works fine and my test documents are validated as
expected.
>
Thanks for suffering through this rather lengthy post. Any help here
would be appreciated.
>
David Lutz
Sr. Prog./Analyst
County of Marin (California)
>
>
>
>
|