2011-09-19 107 views
0

我試圖根據模式驗證一些XML並收集儘可能多的信息以向用戶提供有價值的錯誤消息。C#驗證xml時獲取模式信息

我已經成功地驗證對一個XSD序列化對象。我的ValidationEventHandler被正確調用了所有的錯誤,並且我得到了一些信息。唯一的問題是模式信息在這一點上是不可用的 - 我試圖去到元素的模式類型。即給出下面的架構元素,我想獲得「的BookType」

<element minOccurs="0" maxOccurs="1" name="TypeOfBook" type="myTypes:BookType" /> 

我相信架構/驗證信息被插入在驗證過程中的XML。因此,如果我連續調用兩次驗證,則只能在第二次處理錯誤時使用模式信息。

serializedObject.Validate((x, y) => { }); 
serializedObject.Validate((x, y) => { // handle errors here because elements will have schema info available }); 

很明顯,這個解決方案有很多不足之處。推薦的處理方法是什麼?

回答

0

我找到了解決方案。

每次的ValidationEventHandler被調用,添加XmlSchemaValidationException.SourceObject XMLELEMENT到列表中。一旦驗證完成,架構信息將被添加到這些對象中,使我能夠訪問信息。即Element.SchemaInfo.SchemaType.Name。

的XmlSchemaValidationException被傳遞到與屬性「SourceObject」這是一個XmlElement的事件處理程序。

  List<XmlElement> errorElements = new List<XmlElement>(); 

      serializedObject.Validate((x, y) => 
      { 
       var exception = (y.Exception as XmlSchemaValidationException); 

       if (exception != null) 
       { 
        var element = (exception.SourceObject as XmlElement); 

        if (element != null) 
         errorElements.Add(new XmlValidationError(element)); 
       } 

      }); 
0

XmlNode.SchemaInfo好像它會提供該信息。

我認爲這會在使用創建的XmlReader加載XmlDocument執行XSD驗證時填充。

但是,在執行驗證錯誤處理程序(XmlReaderSettings.ValidationEventHandler)時,在與ValidationEventArgs一起傳遞的XmlSchemaException實例中只有有限的信息可用。特別是在輸入文檔中沒有XmlNode或類似的引用。然而,提到了SourceSchemaObject

+0

我正在使用XmlSerializer將對象序列化爲xml。然後我想驗證xml是否適用於xsd。在第一次調用驗證期間,絕對沒有可用的模式信息(所有與模式相關的porperties都爲空)。在第二個電話。所有的信息都在那裏。 – Craigt