1

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?

1 Answer 1

3

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">
Sign up to request clarification or add additional context in comments.

4 Comments

Thank you. I added the namespace. However, I still had the same messages. -P.S I apologize for so much content, I tried to limit it as much as possible.
@Kiwi I just had a few minutes and ran your code, and it worked with my suggestion added (almost). The XSD you provided does not define the Undergrad and Office attributes, but otherwise all of the other errors you mentioned are no longer present
Okay, I just did that again. It worked fine this time. I'm storing these xml files on the internet. Maybe my cache had something leftover? Not sure. Thank you. -- Any hints on why my attributes aren't getting recognized? It looks like I'm defining the attributes in my XSD right below my simple element definitions...
Yes, I'm definitely having problems with leftover memory somewhere which is messing with me every time I update my files. I changed my XML instance to contain a namespace declaration "cn:" and prefixed my Undergrad and Office attributes with that. That solved the issue...but only after clearing my cache and rebuilding my project. That was frustrating. Thank you for all your help!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.