Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
?
Solved

Need help validating XML against XSD schema.

Posted on 2007-03-26
6
Medium Priority
?
454 Views
Last Modified: 2008-01-09
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
0
Comment
Question by:brdrok
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 2
6 Comments
 
LVL 12

Expert Comment

by:ShazbotOK
ID: 18795722
Where's the eventHandler code?  I am assuming you just forgot to paste that in as well...
0
 
LVL 7

Author Comment

by:brdrok
ID: 18796770
The event handlers are there.  I  didn't want to totally clutter up the screen with code.
0
 
LVL 1

Accepted Solution

by:
cool_bike_rider earned 2000 total points
ID: 18798196
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
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 7

Author Comment

by:brdrok
ID: 18799685
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
 
LVL 7

Author Comment

by:brdrok
ID: 18799700
nevermind...the

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

lines somehow didn't register in my head.
0
 
LVL 1

Expert Comment

by:cool_bike_rider
ID: 18806060
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

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Real-time is more about the business, not the technology. In day-to-day life, to make real-time decisions like buying or investing, business needs the latest information(e.g. Gold Rate/Stock Rate). Unlike traditional days, you need not wait for a fe…
The article shows the basic steps of integrating an HTML theme template into an ASP.NET MVC project
This course is ideal for IT System Administrators working with VMware vSphere and its associated products in their company infrastructure. This course teaches you how to install and maintain this virtualization technology to store data, prevent vuln…
Visualize your data even better in Access queries. Given a date and a value, this lesson shows how to compare that value with the previous value, calculate the difference, and display a circle if the value is the same, an up triangle if it increased…

610 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question