Josh Claxton
Josh Claxton

Reputation: 410

XML schema validation via C#

Problem: I am trying to validate an XML schema file against an XML instance file using C#. However I keep getting these messages:

Could not find schema information for the element 'Courses'.
Could not find schema information for the element 'Course'.
Could not find schema information for the element 'Code'.
Could not find schema information for the attribute 'Undergrad'.
Could not find schema information for the element 'CourseName'.
Could not find schema information for the element 'Instructor'.
Could not find schema information for the element 'Name'.
Could not find schema information for the element 'First'.
Could not find schema information for the element 'Last'.
Could not find schema information for the element 'Contact'.
Could not find schema information for the attribute 'Office'.
Could not find schema information for the element 'Phone'.
Could not find schema information for the element 'Room'.
Could not find schema information for the element 'Cap'.

My schema file (tempuri.com is replaced by the real location in my actual file)

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema targetNamespace="http://www.tempuri.com/Courses3.xsd"
    elementFormDefault="qualified"
    attributeFormDefault="unqualified"
    xmlns="http://www.tempuri.com/Courses3.xsd"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
>
  <!--definition of simple elements-->
  <xsd:element name="Cap" type="xsd:integer"/>
  <xsd:element name="Room" type="xsd:string"/>
  <xsd:element name="Phone" type="xsd:integer"/>
  <xsd:element name="First" type ="xsd:string"/>
  <xsd:element name="Last" type ="xsd:string"/>
  <xsd:element name="CourseName" type ="xsd:string"/>

  <!--definition of attributes-->
  <xsd:attribute name="Grad" type="xsd:string"/>
  <xsd:attribute name="Undergrad" type="xsd:string"/>
  <xsd:attribute name="Office" type="xsd:string"/>


  <!--definition of complext elements-->

  <!--Courses-->
  <xsd:element name="Courses">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="Course" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <!--Course-->
  <xsd:element name="Course">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="Code" minOccurs="1" maxOccurs="1"/>
        <xsd:element ref="CourseName" minOccurs="1" maxOccurs="1"/>
        <xsd:element ref="Instructor" minOccurs="1" maxOccurs="1"/>
        <xsd:element ref="Room" minOccurs="0" maxOccurs="1"/>
        <xsd:element ref="Cap" minOccurs="1" maxOccurs="1"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <!--Code-->
  <xsd:element name="Code">
    <xsd:complexType>
      <xsd:attribute ref="Grad" use ="optional"/>
      <xsd:attribute ref="Undergrad" use ="optional"/>
    </xsd:complexType>
  </xsd:element>

  <!--Instructor-->
  <xsd:element name="Instructor">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="Name" minOccurs="1" maxOccurs="1"/>
        <xsd:element ref="Contact" minOccurs="0" maxOccurs="1"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <!--Name-->
  <xsd:element name="Name">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="First" minOccurs="1" maxOccurs="1"/>
        <xsd:element ref="Last" minOccurs="1" maxOccurs="1"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <!--Contact-->
  <xsd:element name="Contact">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="Phone" minOccurs="0" maxOccurs="1"/>
      </xsd:sequence>
      <xsd:attribute ref="Office" use ="optional"/>
    </xsd:complexType>
  </xsd:element>

</xsd:schema>

My XML instance:

<?xml version="1.0" encoding="utf-8"?>
<Courses>
  <Course>
    <Code Undergrad ="CSEXXX"/>
    <CourseName>
      Programming
    </CourseName>
    <Instructor>
      <Name>
        <First>
          Jim
        </First>
        <Last>
          Bob
        </Last>
      </Name>
      <Contact Office ="MLG562">
        <Phone>
          5555555555
        </Phone>
      </Contact>
    </Instructor>
    <Room>
      TLK130
    </Room>
    <Cap>
      70
    </Cap>
  </Course>

My C# validation methods:

public string CoursesVerification(string pXMLurl, string pXSDurl)
    {
        XmlValidatingReader vr = null;
        try
        {
            XmlTextReader nvr = new XmlTextReader(pXMLurl); //get xml file
            nvr.WhitespaceHandling = WhitespaceHandling.None;
            vr = new XmlValidatingReader(nvr); //wrap nvr in vr
            vr.Schemas.Add(GetTargetNamespace(pXSDurl), pXSDurl);
            vr.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
            while (vr.Read());
            return _VerifyString;
        }
        catch (Exception ex)
        {
            return ex.Message;
        }
        finally
        {
            if (vr != null) vr.Close();
        }
    }

    static string GetTargetNamespace(string src)
    {
        XmlTextReader nvr = null;
        try
        {

            nvr = new XmlTextReader(src);
            nvr.WhitespaceHandling = WhitespaceHandling.None;
            while (nvr.Read())
            {
                if (nvr.NodeType == XmlNodeType.Element && nvr.LocalName == "schema")
                {
                    while (nvr.MoveToNextAttribute())
                    {
                        if (nvr.Name == "targetNamespace") return nvr.Value;
                    }
                }
            }
            return "";
        }
        finally
        {
            if (nvr != null) nvr.Close();
        }
    }

    static void ValidationCallBack(object sender, ValidationEventArgs e)
    {
        if (String.Compare(_VerifyString, "No Error") == 0) _VerifyString = e.Message + "\n";
        else _VerifyString += e.Message + "\n";
    }

I have been looking everywhere trying to figure out what I am overlooking. What am I doing wrong with this validation?

Upvotes: 1

Views: 2369

Answers (1)

psubsee2003
psubsee2003

Reputation: 8741

Just a quick glance as I don't have time to dig through everything, it looks like your XML file does not define a namespace, but your XSD does. That is probably a place to start looking. In your root element of your XML file, you need to specify the namespace.

<Courses xmlns="http://www.tempuri.com/Courses3.xsd">

Upvotes: 3

Related Questions