Need help validating XML against XSD schema.

Hi,

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"
                  targetNamespace="http://tempuri.org/FlatFileGenXMLSchema.xsd"
                  elementFormDefault="qualified"
                  xmlns="http://tempuri.org/FlatFileGenXMLSchema.xsd"
                  xmlns:mstns="http://tempuri.org/FlatFileGenXMLSchema.xsd"
                  xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="DataSources" type="dataSourcesType"></xs:element>
 
  <xs:complexType name="dataSourcesType">
      <xs:sequence>
            <xs:element name="ZipGroup" type="zipGroupType"></xs:element>
      </xs:sequence>
      <xs:attribute name="continueOnError" type="xs:boolean" />
  </xs:complexType>
 
  <xs:complexType name="zipGroupType">
      <xs:sequence>
            <xs:element name="Summary" type="summaryType" />
            <xs:element name="DataSource" type="dataSourceType" />
      </xs:sequence>
      <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" />
  </xs:complexType>

  etc...

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">
      
      <DataSource>
            <FileName>Person.txt</FileName>
            <Destination>C:\FlatFile</Destination>
            <SQLQuery>SELECT  * FROM PERSONS</SQLQuery>
            <ConnectionString>server=.;uid=xx;pwd=xxxxxxx;database=xxxxxx;</ConnectionString>
            <Factory>System.Data.SqlClient</Factory>
            <Encoding>Unicode</Encoding>
            <AppendDateToFileName>true</AppendDateToFileName>
      </DataSource>

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);
            schema.Compile(handler);

            //validate XML against the Schema
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.Schemas.Add("http://tempuri.org/FlatFileGenXMLSchema.xsd", 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
            }

            vr.Close();

            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.


Thanks
LVL 7
brdrokAsked:
Who is Participating?
 
cool_bike_riderCommented:
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)
            {
                  try
                  {
                        // 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.Schemas.Add(xsc);
                        vr.ValidationType = ValidationType.Schema;
                        vr.ValidationEventHandler += new ValidationEventHandler(ValidationHandler);
                        while(vr.Read());
                        vr.Close();
                        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);
                  }
            }
0
 
ShazbotOKCommented:
Where's the eventHandler code?  I am assuming you just forgot to paste that in as well...
0
 
brdrokAuthor Commented:
The event handlers are there.  I  didn't want to totally clutter up the screen with code.
0
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="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

and changed the following line of code from:
settings.Schemas.Add("http://tempuri.org/FlatFileGenXMLSchema.xsd", xsdFile);

to
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.
0
 
brdrokAuthor Commented:
nevermind...the

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

lines somehow didn't register in my head.
0
 
cool_bike_riderCommented:
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... :)
0
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.