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)