通过C#进行XML模式验证

时间:2012-03-31 22:13:57

标签: c# xml xsd xml-parsing

问题:我正在尝试使用C#针对XML实例文件验证XML模式文件。但是我一直收到这些消息:

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'.

我的架构文件(tempuri.com被实际文件中的实际位置取代)

<?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>

我的XML实例:

<?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>

我的C#验证方法:

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";
    }

我一直在寻找各处试图找出我所忽视的东西。这次验证我做错了什么?

1 个答案:

答案 0 :(得分:3)

只是快速浏览一下,因为我没有时间挖掘所有内容,看起来你的XML文件没有定义命名空间,但你的XSD确实如此。这可能是一个开始寻找的地方。在XML文件的根元素中,您需要指定命名空间。

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