I have an XSD file and an XML file, how can I check if the XML is in the right schema like the XSD file?
i know there is an validate function in the XmlDocumen
You can create a validating XmlReader instance using the XmlReaderSettings class and the Create method.
private bool ValidateXml(string xmlFilePath, string schemaFilePath, string schemaNamespace, Type rootType)
{
XmlSerializer serializer = new XmlSerializer(rootType);
using (var fs = new StreamReader(xmlFilePath, Encoding.GetEncoding("iso-8859-1")))
{
object deserializedObject;
var xmlReaderSettings = new XmlReaderSettings();
if (File.Exists(schemaFilePath))
{
//select schema for validation
xmlReaderSettings.Schemas.Add(schemaNamespace, schemaPath);
xmlReaderSettings.ValidationType = ValidationType.Schema;
try
{
using (var xmlReader = XmlReader.Create(fs, xmlReaderSettings))
{
if (serializer.CanDeserialize(xmlReader))
{
return true;
//deserializedObject = serializer.Deserialize(xmlReader);
}
else
{
return false;
}
}
}
catch(Exception ex)
{ return false; }
}
}
}
The above code will throw an exception if the schema is invalid or it is unable to deserialize the xml. rootType is the type of the root element in the equivalent class hierarchy.
Example :
Schema at: XML Schema Tutorial. Save the file as D:\SampleSchema.xsd.
Run xsd.exe:
xsd.exe /c /out:D:\ "D:\SampleSchema.xsd"/out option is to specify the output directory, /c is to specify the tool to generate classesD:\SampleSchema.cs
//------------------------------------------------------------------------------
//
// This code was generated by a tool.
// Runtime Version:2.0.50727.4952
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
//
//------------------------------------------------------------------------------
using System.Xml.Serialization;
//
// This source code was auto-generated by xsd, Version=2.0.50727.3038.
//
///
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class note {
private string toField;
private string fromField;
private string headingField;
private string bodyField;
///
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string to {
get {
return this.toField;
}
set {
this.toField = value;
}
}
///
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string from {
get {
return this.fromField;
}
set {
this.fromField = value;
}
}
///
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string heading {
get {
return this.headingField;
}
set {
this.headingField = value;
}
}
///
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string body {
get {
return this.bodyField;
}
set {
this.bodyField = value;
}
}
}
Add the class to the visual studio project.
For the above xsd sample, the root class is note.
Call the method,
bool isXmlValid = ValidateXml(@"D:\Sample.xml",
@"D:\SampleSchema.xsd",
@"http://www.w3.org/2001/XMLSchema",
typeof(note));
More info: