2009-04-28 58 views
0

在我的項目中,我有非常大的XSD文件,我用它來驗證一些XML請求和對第三方的響應。xsd驗證againts xsd生成的類級別驗證

對於上述方案,我可以有兩種方式

1)創建XML,然後驗證對給定XSD 2)從XSD與XSD根工具的幫助下創建類,添加attirbutes的XTRA位,並利用它們進行驗證。

驗證在所述第二方式將在本方式有些工作, 一個)轉換XML請求/響應與XML序列 b)中驗證在每個屬性,即,設置的自定義屬性的對象對象傳遞的對象的方法它將通過遍歷屬性及其在每個屬性上設置的自定義屬性來驗證對象,並且如果對象驗證並且確定xml請求是否有效,這將返回布爾值?

現在關注哪種方法在性能和其他方面都很好?

回答

0

我不確定將您的XML反序列化爲對象是否會給您提供您需要的驗證。

以XSD爲例,它定義了一個字符串字段,然後約束可以出現在該字段中以匹配某個正則表達式的文本。你的生成的類會遵守這個約束嗎?有這樣的一些微妙的問題,可能會讓你處於你接受無效的XML或拒絕其他有效的XML的情況。

如果你的第三方給了你一個XSD來驗證,那麼最好你堅持這個合同的定義而不是找到捷徑。

然而,您可能會發現有很常見的錯誤和錯誤,您可以快速過濾掉。這一切都取決於您的信噪比,但您可能會考慮創建一個簡單的XSD或程序測試,然後再投入時間運行完整的XSD,然後可以「快速失敗」。但是,如果您遇到很多故障並且使用XSD進行完全驗證的成本很高,這樣做纔有意義。

此外,請確保您爲您的方案使用最快的XSD驗證。你沒有說過,如果這是一個.NET環境,但是如果它是XmlDocument,XmlValidatingReader和XElement作爲讀取XML和根據方案驗證它的三種方式。根據你從哪裏得到XML,以後你在做什麼,你應該評估哪些機制爲你提供了最好的性能。

1

如果您的主要擔心是性能您應該使用XmlReader並附上XSD架構進行驗證。這裏是一個例子:

// Store a reference to this object 
// to reuse the compiled XSD schema 
// for multiple parsing operations 
XmlReaderSettings settings = new XmlReaderSettings(); 
settings.Schemas.Add("http://www.contoso.com/books", "books.xsd"); 
settings.ValidationType = ValidationType.Schema; 

using (XmlReader reader = XmlReader.Create("books.xml", settings)) 
{ 
    while (reader.Read()) 
    { 
     // Do parsing logic 
    } 
}