2012-04-01 120 views
6

我正在使用多個XElement對象來爲我的庫中的多個對象提供一些用戶指定的數據。我試圖避免指定整個XML文件的結構,因爲只要所需的特定元素結構正確,庫不應該關心整個XML的外觀。XElement的XML模式驗證

爲此,我有3個單獨的XSD文件,這些文件爲我的類的每個需求定義模式,但是我遇到了一些針對模式驗證XElement的問題。沒有解決方法似乎沒有辦法做到這一點。

從MSDN頁面看,XElement.Validate()擴展方法似乎適合重新驗證較大文件的子元素。 XmlSchemaObject的論點是造成我的問題,因爲我不能認爲它會出現在任何XElements。我想我可以通過從我的XmlSchemaSet中抓取XmlSchemaElement來解決這個問題,以通過XmlSchemaObject的說法,但由於XmlSchemaSet已經定義了所有內容,所以必須這樣做是很奇怪的。

有沒有更好的選擇來驗證XElement與模式沒有首先驗證整個XDocument

或者我應該讓業務層處理應用程序中的模式驗證,並讓庫假定XElement已經正確組建(我認爲這個選項,但是作爲個人偏好更喜歡避免拋出異常,寧願讓調用方法知道XElement通過返回參數無效)。

回答

9

我明白你提供的API的問題,據我看來你有兩個選擇,一個是把你的XElement放入一個XDocument與例如。 XDocument doc = new XDocument(xElementToValidate);,然後致電the Validate method on that XDocument,其中所有您必須通過的是XmlSchemaSet,第二個選項是您自己概述的方式,即使用XElementValidate方法,確保您傳遞了XmlSchemaSet和根元素定義該模式設置爲XmlSchemaObject。如果這些只是一個頂級元素定義的簡單模式,您只需要

XmlSchemaSet schemaSet = new XmlSchemaSet(); 
    schemaSet.Add(null, "schema.xsd"); 
    schemaSet.Compile(); 

    XmlSchemaObject schemaObject = schemaSet.GlobalElements.Values.OfType<XmlSchemaObject>().First(); 

如果包裹兩種方法之一進入一個方法,那麼它應該不會比調用類似的簡便方法.NET框架可能提供更多的努力。

+0

我不知道爲什麼我沒有想到在我自己的'XElement.Validate()'擴展方法中包裝代碼。現在看來很符合你說的。創建一個'XDocument'是另一個好主意,應該也是我發生的事情(我花了太多時間試圖找出如何轉換它,而我錯過了明顯的解決方案)。我會試驗兩個,看看我更喜歡哪一個。 – psubsee2003 2012-04-03 00:22:41