2012-03-31 62 views
1

問題:我想驗證XML模式文件對照使用C#的XML實例文件。但是我不斷收到這些消息:通過C#驗證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"; 
    } 

我一直在尋找處處試圖找出我所忽略的東西。我在做什麼錯誤驗證?

回答

2

匆匆一瞥,因爲我沒有時間挖掘所有內容,它看起來像你的XML文件沒有定義一個命名空間,但是你的XSD確實如此。這可能是一個開始尋找的地方。在您的XML文件的根元素中,您需要指定名稱空間。

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

謝謝。我添加了命名空間。不過,我仍然有相同的信息。 -P.S我對這麼多內容表示歉意,我儘量限制它。 – 2012-03-31 22:49:54

+0

@Kiwi我剛剛過了幾分鐘並運行了你的代碼,並且它與我的建議(幾乎)相加。您提供的XSD沒有定義Undergrad和Office的屬性,但是您提到的所有其他錯誤都不再存在 – psubsee2003 2012-03-31 23:02:09

+0

好的,我只是再次做了。這次它工作得很好。我在互聯網上存儲這些XML文件。也許我的緩存有剩餘的東西?不確定。謝謝。 - 關於爲什麼我的屬性不被識別的提示?它看起來像我在我的XSD中的屬性定義在我的簡單元素定義之下... – 2012-03-31 23:31:24