Need help validating XML against XSD schema.


XML and XSD newbie here.  I am trying to validate an XML file with an XSD schema but even when I introduce errors on purpose, I still do not get an validation error.  

Below is my XSD code:

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema id="FlatFileGenXMLSchema"

  <xs:element name="DataSources" type="dataSourcesType"></xs:element>
  <xs:complexType name="dataSourcesType">
            <xs:element name="ZipGroup" type="zipGroupType"></xs:element>
      <xs:attribute name="continueOnError" type="xs:boolean" />
  <xs:complexType name="zipGroupType">
            <xs:element name="Summary" type="summaryType" />
            <xs:element name="DataSource" type="dataSourceType" />
      <xs:attribute name="FileName" type="xs:string" use="required" />
    <xs:attribute name="Destination" type="xs:string" use="required" />
    <xs:attribute name="ToZip" type="xs:string" use="required" />
    <xs:attribute name="intHour" type="xs:int" use="required" />


Below is an excerpt of my XML file:

<?xml version='1.0' encoding='utf-8'?>

<DataSources continueOnError="false">

  <ZipGroup FileName="ZipGroup1" Destination="C:\FlatFile" ToZip="true" intHour="lalalal">
            <SQLQuery>SELECT  * FROM PERSONS</SQLQuery>

Below is my C# code that is suppose to validate my XML file against the XSD schema:

        private void button1_Click(object sender, EventArgs e)
            string xsdFile = @"C:\mySchema.xsd";
            string xmlFile = @"C:\myXML.xml";

            XmlReader vr;

            //validate XML Schema itself
            ValidationEventHandler handler = new ValidationEventHandler(Form1.Handler);
            XmlSchema schema = XmlSchema.Read(File.OpenRead(xsdFile), handler);

            //validate XML against the Schema
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.Schemas.Add("", xsdFile);
            settings.ValidationType = ValidationType.Schema;
            settings.ValidationEventHandler += new ValidationEventHandler(settings_ValidationEventHandler);

            FileStream fs = new FileStream(xmlFile, FileMode.Open);

            vr = XmlReader.Create(fs, settings);

            while (vr.Read())
                //do nothing


            MessageBox.Show("Doc is valid");

Please notice that I set the values of "intHour" to "lalalala" for the <ZipGroup> element.  In my XSD, I have specified that the "intHour" attribute is suppose to contain only integers.

Who is Participating?
Here is the function I am using to validate xml against xsd... Same methode but with a different logic

//convert the xml file into a string and pass as a parameter
public string Validate(string strXMLDoc)
                        // Declare local objects
                        XmlTextReader         tr   = null;
                        XmlSchemaCollection   xsc  = null;
                        XmlValidatingReader   vr   = null;
            tr  = new XmlTextReader("xsdFile.xsd");
                        xsc = new XmlSchemaCollection();

      xsc.Add(null, tr);
                        vr = new XmlValidatingReader(strXMLDoc,XmlNodeType.Document, null);
                        vr.ValidationType = ValidationType.Schema;
                        vr.ValidationEventHandler += new ValidationEventHandler(ValidationHandler);
                        if (ErrorsCount > 0)
                              throw new Exception(ErrorMessage);
                        return("XML validation succeeded.\r\n");
                  catch(Exception error)
                        return("XML validation failed." + "\r\n" +
                              "Error Message: " + error.Message);
Where's the eventHandler code?  I am assuming you just forgot to paste that in as well...
brdrokAuthor Commented:
The event handlers are there.  I  didn't want to totally clutter up the screen with code.
Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

brdrokAuthor Commented:
Thank you cool_bike,

in the end it turned out that the attributes of my <xs:schema...> elements were a little out of whack.

I simplified it to the following:

<xs:schema id="FlatFileGenXMLSchema" xmlns="" xmlns:xs="" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

and changed the following line of code from:
settings.Schemas.Add("", xsdFile);

settings.Schemas.Add("", xsdFile);

I don't know how or why it works, but at this point, I am just glad it works =)

By the way Cool Bike Rider, I am curious why you have wrapped your validation logic inside a Try-Catch statement because you already have the following line of code:

 vr.ValidationEventHandler += new ValidationEventHandler(ValidationHandler);

if I understand correctly the event handler will catch all the invalid xml elements.
brdrokAuthor Commented:

            if (ErrorsCount > 0)
                              throw new Exception(ErrorMessage);

lines somehow didn't register in my head.
Following is my event handler... here 'ErrorMessage' and 'ErrorsCount' are static variables.... same I am using inside validation function.

public static void ValidationHandler(object sender, ValidationEventArgs args)
                  ErrorMessage = ErrorMessage + args.Message + "\r\n";
                  ErrorsCount ++;

I just tried a different logic here... Hope you convinced... :)
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.