Introduction
If anyone does not know this, here is a quick code snippet that shows one way to validate an XML document.
FileStream fs = File.Open("../../signatureinstance.xml", FileMode.Open);
XmlTextReader reader = new XmlTextReader(fs);
XmlValidatingReader xvr = new XmlValidatingReader(reader);
xvr.ValidationType = ValidationType.Schema;
xvr.Schemas.Add(null, "../../signatureschema.xsd");
xvr.ValidationEventHandler += new ValidationEventHandler(xvr_ValidationEventHandler);
XmlDocument xdoc = new XmlDocument();
xdoc.Load(xvr);
In the above example, the XML instance to be validated is signatureinstance.xml. The schema doing the validation is signature.xsd. A type called XmlValidatingReader
, found in the System.Xml namespace, is used to perform the validation at load time. (It is also possible to load the XmlDocument
first and use the Validate()
function to validate the contents against a given schema.
Just in case anyone reading does not understand how I might have gotten to this point, I will go through a few steps (using the Visual Studio .NET 2005 IDE).
The first step (after creating a project of course) is adding a schema to your project. The XML schema template should be listed amongst other document types that can be added. Make sure not to select Dataset
; although they both use .xsd extensions and are essentially the same technology, there are some differences. The item we are looking for is shown in the picture below:
Next we design the schema using the toolbox, which at this point should have changed to a list of tools related to editing XML schemas. The new toolbox view is illustrated in the picture below:
Now we can design our schema. The Signature schema design is given below:
Once that's done, we can work on creating a sample instance using the schema as a reference. VS.NET 2005 allows you to associate a given schema to the instance you are currently working with. The schema property can be found on the property pane.
When you click on the ellipsis for the schema property, a property page with all the currently known schemas will appear:
You can use this tool to add more known schemas. For this project, select the signature schema designed.
Using this, I created the schema shown below:
="1.0"="utf-8"
<Signature xmlns="http://tempuri.org/XMLSchema1.xsd">
<Company>
Perficient Inc.
</Company>
<Name>Jerod Edward Moemeka</Name>
<Position>Architect</Position>
<OfficeAddress>
<Address>622 Emerson Road</Address>
<Suite>400</Suite>
<City>St. Louis</City>
<State>MO</State>
<Zip>63141</Zip>
</OfficeAddress>
<ContactInfo>
<EmailAddress>jerod.moemeka@perficient.com</EmailAddress>
<CompanyURL>www.perficient.com</CompanyURL>
<PhoneInfo>
<OfficePhoneNumber>1234567890</OfficePhoneNumber>
<MobileNumber>9876543210</MobileNumber>
<FaxNumber>1112223333</FaxNumber>
</PhoneInfo>
</ContactInfo>
</Signature>
At this point, validation using the example above will work. However, there are also some other ways to accomplish this. If for instance, you did not mind the document being loaded ahead of time and then validated, you could use the DOM object directly to validate as follows:
XmlDocument xdoc = new XmlDocument();
xdoc.Load("../../signatureschemainstance.xml");
xdoc.Schemas.Add(null, "../../signatureschemaschema.xsd");
ValidationEventHandler veh = new ValidationEventHandler(xvr_ValidationEventHandler);
xdoc.Validate(veh);
In .NET 2.0, the XmlValidatingReader
is deprecated, hence the initial example should be as follows:
FileStream fs = File.Open("../../signatureinstance.xml", FileMode.Open);
XmlDocument xdoc = new XmlDocument();
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add(null, "../../signatureschema.xsd");
XmlUrlResolver resolver = new XmlUrlResolver();
resolver.Credentials = System.Net.CredentialCache.DefaultCredentials;
settings.XmlResolver = resolver;
settings.ValidationType = ValidationType.Schema;
settings.ValidationEventHandler +=
new ValidationEventHandler(xvr_ValidationEventHandler);
XmlReader reader = XmlReader.Create(fs, settings);
xdoc.Load(reader);
fs.Close();
To load the schema once and not continually, go get it from the source URL (in this case ../../signatureschema.xsd. We can rewrite this to use the Schema
object as follows:
ValidationEventHandler veh = new ValidationEventHandler(xvr_ValidationEventHandler);
XmlSchema schema = XmlSchema.Read(new XmlTextReader("../../productschema.xsd"), veh);
FileStream fs = File.Open("../../productcataloginstance.xml", FileMode.Open);
XmlDocument xdoc = new XmlDocument();
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add(schema);
settings.ValidationType = ValidationType.Schema;
settings.ValidationEventHandler +=
new ValidationEventHandler(xvr_ValidationEventHandler);
XmlReader reader = XmlReader.Create("../../productcataloginstance.xml", settings);
xdoc.Load(reader);
History
- 28th February, 2006: Initial post