2013-03-26 33 views
3

我有xml發送到網頁,我想驗證幾個xsd,直到文件驗證。驗證後,我可以根據管理的驗證模式來確定xml文件的類型。對多個模式驗證未知的xml,直到找到匹配

List<string> xsdList = new List<string>(); 

    xsdList.Add(_path + @"Handlers\DeviceSpecificHandlers\Schemas\Enquiry.xsd"); 
    xsdList.Add(_path + @"Handlers\DeviceSpecificHandlers\Schemas\FingerDeleted.xsd"); 
    xsdList.Add(_path + @"Handlers\DeviceSpecificHandlers\Schemas\Heartbeat.xsd"); 
    xsdList.Add(_path + @"Handlers\DeviceSpecificHandlers\Schemas\Validation.xsd"); 

    XmlSchemaSet schemas = new XmlSchemaSet(); 

    foreach (string schema in xsdList) 
    { 
    var reader = new StringReader(File.ReadAllText(schema)); 
    schemas.Add("", XmlReader.Create(reader)); 
    } 

    request.Validate(schemas, (o, e) => 
    { 
    match = false; 
    }); 

誰能幫助,上面是什麼香港專業教育學院拼湊起來的,到目前爲止,它目前拋出一個錯誤「System.Xml.Schema.XmlSchemaValidationException:全球元素‘接口’已經聲明」

有沒有一種方法可以獲得返回哪個模式的valiation成功?

回答

4

首先,你必須弄清楚XSD文件可以放在一個文件集中。您收到的錯誤告訴您,相同的元素「界面」的定義來自兩個或更多不同的基本URI。

如果您想動態確定這些設置,那麼您需要做一些工作。這是可能的,但這不是微不足道的。它取決於XSD文件是否使用組合(包括/導入/重新定義)。如果它們不是(簡單的場景),那麼爲了將XSD文件放在一起,您必須單獨加載每個XSD文件,爲所有全局定義的內容(類型,元素,組,屬性,屬性組)建立索引,然後放入將這些集合放在一起,使得給定集合中的任何一對單獨的XSD成員,交集是空的。構建集合的策略取決於許多因素,性能和覆蓋面只有兩個。基於這種微不足道的情況,您可以看到組合的重要性,因爲即使交叉點不是空的,因爲如果公共內容來自同一個URI,所有意圖都將被視爲空。

QTAssistant(我與它關聯)有一個完整的引擎來處理上述問題,以便爲任何XSD內容「收集」用於分析時爲其XML Schema重構引擎設置XML Schema源集(或集合) ,驗證等。

一旦你確定了這些集合,就必須對這些模式的組成做出假設。換句話說,構成一組有效的XML文檔元素(有時不是全部全局元素定義是有效的文檔元素)以及應該爲每個文檔元素使用什麼模式集。很明顯,你必須以某種方式處理這個問題,因爲你有重複的元素。

如果您想按照您的問題來處理它,那麼只需循環遍歷上面構造的一組模式集即可。

想出一個關於如何手動計算最佳設置的策略的最佳方法可能是可視化您的XSD文件之間的關係。下面是我如何使用可用的工具從SO的另一篇文章中看到它。

enter image description here

+0

謝謝你,這說明了一切。我對XSD驗證的理解很有意義。 – DavidB 2013-03-26 13:39:06

1

http://msdn.microsoft.com/en-us/library/fe6y1sfe(v=vs.110).aspx

「架構在XmlSchemaSet中通過的XmlSchemaSet的編譯方法編譯成一個邏輯模式」

因此,要針對多個獨立模式進行驗證,您應該爲每個XSD創建一個XmlSchemaSet

然後,你可以這樣做:

bool xmlIsValid = true; 
XmlSchemaSet validatingSchema; 
foreach (XmlSchemaSet schema in schemas) { 
    xml.Validate(schema, (o, e) => { xmlIsValid = false; }); 
    if (xmlIsValid) { 
     validatingSchema = schema; 
     break; 
    } 
}