2012-08-13 46 views
4

使用命名空間爲http://mynamespace的XML模式。如果驗證了默認名稱空間爲xmlns="http://mynamespace"的錯誤XML文檔,則按預期拋出異常。而如果有人更改名稱空間(http://Wrongnamespace),則此錯誤的XML將通過驗證.net錯誤名稱空間上的xml模式驗證

以下是具有模式驗證的單元測試。方法XSD_NotValid_2無法正常工作:

[TestClass] 
public class XSDTest 
{ 
    public System.Xml.XmlReaderSettings ReaderSettings 
    { 
     get 
     { 
      string sXSD = "<xsd:schema targetNamespace=\"http://mynamespace\" xmlns=\"http://mynamespace\"" 
       + " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" elementFormDefault=\"qualified\">" 
      + "<xsd:element name=\"Root\">" 
      + "<xsd:complexType>" 
       + "<xsd:sequence>" 
        + "<xsd:element name=\"Child\" minOccurs=\"1\" maxOccurs=\"1\" />" 
       + "</xsd:sequence>" 
      + "</xsd:complexType>" 
      + "</xsd:element>" 
      + "</xsd:schema>"; 

      System.Xml.Schema.XmlSchema schema = System.Xml.Schema.XmlSchema.Read(new System.IO.StringReader(sXSD) 
         , new System.Xml.Schema.ValidationEventHandler(OnValidationFail)); 

      System.Xml.XmlReaderSettings readerSettings_Ret = new System.Xml.XmlReaderSettings(); 
      readerSettings_Ret.ValidationType = System.Xml.ValidationType.Schema; 
      readerSettings_Ret.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(OnValidationFail); 
      readerSettings_Ret.Schemas.Add(schema); 

      return readerSettings_Ret; 
     } 
    } 


    private void OnValidationFail(object s, System.Xml.Schema.ValidationEventArgs e) 
    { 
     throw new OperationCanceledException("Validation error: " + e.Message); 
    } 

    [TestMethod] 
    public void XSD_Valid_Test() 
    { 
     // Valid elements and valid namespace 
     String sXML_Valid = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" 
      + "<Root xmlns=\"http://mynamespace\"><Child /></Root>"; 
     System.Xml.XmlReader xmlReader_Valid = 
      System.Xml.XmlReader.Create(new System.IO.StringReader(sXML_Valid), this.ReaderSettings); 
     while (xmlReader_Valid.Read()) { } // no fail expected 
    } 

    [TestMethod] 
    [ExpectedException(typeof(OperationCanceledException))] 
    public void XSD_NotValid_1() 
    { 
     // No valid elements, while valid namespace 
     String sXML_NotValid_1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" 
      + "<BadRoot xmlns=\"http://mynamespace\"><Child /></BadRoot>"; 
     System.Xml.XmlReader xmlReader_NoValid_1 = 
      System.Xml.XmlReader.Create(new System.IO.StringReader(sXML_NotValid_1), this.ReaderSettings); 
     while (xmlReader_NoValid_1.Read()) ; 
    } 

    [TestMethod] 
    [ExpectedException(typeof(OperationCanceledException))] 
    public void XSD_NotValid_2() 
    { 
     // No valid elements and no valid namespace 
     String sXML_NotValid_2 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" 
      + "<Root xmlns=\"http://Wrongnamespace\"><NotValidChild /></Root>"; 
     System.Xml.XmlReader xmlReader_NoValid_2 = 
      System.Xml.XmlReader.Create(new System.IO.StringReader(sXML_NotValid_2), this.ReaderSettings); 
     while (xmlReader_NoValid_2.Read()) ; 
    } 
} 

這是正常行爲嗎?如何強制正確的命名空間定位? 還有如何強制要求Root元素的情況下XSD有額外的Root2元素?

回答

3

如果啓用模式驗證警告,您會收到以下錯誤:

Could not find schema information for the element 'http://Wrongnamespace:Root'.

使用

readerSettings_Ret.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings; 

一對夫婦的小東西:

  1. 即使在一個單元測試,你不應該通過字符串操作來創建XML。總是使用XML API來創建XML,因爲他們知道「所有規則」。
  2. 即使在單元測試中,您也應該在using塊中創建實現IDisposable的對象。事實上,在單元測試中,我會說,尤其是,其中每個測試都應該獨立於其他測試,您希望確保在開始下一個測試之前已經清理了一個測試。
+0

絕對同意。當然,我在VS中構建了XSD。它僅用於演示目的和快速複製粘貼。 – Artru 2012-08-13 14:10:23

相關問題