2016-04-22 83 views
0

我需要用戶提供的XML文件來匹配2個可能的模式中的1個。如何根據2個XSD驗證1個XML文件?

沿本教程之後,作爲我們的「真實」的XSD的是還沒有完成:

https://msdn.microsoft.com/en-us/library/bb387037.aspx

除了我希望該教程的「逆」。所以我修改它,以便有一個第二xsdMarkup

static void Main(string[] args) 
{ 
    string xsdMarkup1 = CreateXsd(2); 
    string xsdMarkup2 = CreateXsd(3); 

    XmlSchemaSet schemas = new XmlSchemaSet(); 
    schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup1))); 
    schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup2))); 

    XDocument doc1 = CreateXDoc(2); 
    XDocument doc2 = CreateXDoc(3); 

    Validate(doc1, schemas); 
    Validate(doc2, schemas); 

    Console.ReadLine(); 
} 

期望輸出:雙方應驗證作爲第一個架構支持Child1Child2,而第二個架構支持Child1Child3

方法CreateXsd,CreateXDocValidate只包含教程中的代碼。 int我傳遞給它只是附加到第二個Child元素,所以你有Child1Child2Child3作爲第二個元素,這取決於傳遞的內容。

當我運行此,Validate(doc1, schemas);崩潰,出現此錯誤:

The global element 'Root' has already been declared.

這似乎是因爲我的兩個xsdMarkup變量使用相同的xmlns價值,它只是附加的模式到第一模式。好的,沒問題,我只是改變第二個命名空間......不;由於URL無效而崩潰,我不知道我可以替代什麼。

所以,假設說,我有兩個功能模式。我可以撥打XmlSchemaSet.Add兩次,然後致電XDocument.Validate(myXmlSchemaSetObj, someValidationEventHandlerDefintion);驗證1個文件是否符合多個模式?

回答

1

我認爲它不適合你,因爲你指定「」作爲targetNamespace兩次。這聽起來像是你還在開發這個項目,所以我們可以通過打破現在的邏輯來讓你「爲節目打補丁」。

P.S.您也可以嘗試在上面的代碼中傳遞一個空值而不是「」作爲targetNameSpace ......也許這也會起作用!

static void Main(string[] args) 
{ 
    string xsdMarkup1 = CreateXsd(2); 
    string xsdMarkup2 = CreateXsd(3); 

    XmlSchemaSet schemas1 = new XmlSchemaSet(); 
    schemas1.Add("", XmlReader.Create(new StringReader(xsdMarkup1))); 
    XmlSchemaSet schemas2 = new XmlSchemaSet(); 
    schemas2.Add("", XmlReader.Create(new StringReader(xsdMarkup2))); 

    XDocument doc1 = CreateXDoc(2); 
    XDocument doc2 = CreateXDoc(3); 

    Validate(doc1, schemas1); 
    Validate(doc1, schemas2); 
    Validate(doc2, schemas1); 
    Validate(doc2, schemas2); 

    Console.ReadLine(); 
} 
+0

這可能行得通,我馬上試試。但是'XmlSchema'和'XmlSchemaSet'有什麼區別?我認爲後者將是一個容器,對於'XmlSchema'對象的集合不是?我想你可以基本上存儲一些模式來單獨驗證。似乎相反,直覺必須爲每個我想要驗證的模式創建一個單獨的Set對象... – sab669

+0

我認爲這對你來說很重要,因爲你指定「」作爲targetNamespace兩次。 https://msdn.microsoft.com/en-us/library/1hh8b082(v=vs.110).aspx – montewhizdoh

+0

這是行不通的。雖然我不明白爲什麼我必須這樣做,但如果它起作用,那就是重要的。空引號(或null)強制它使用XSD中定義的名稱空間。在這種情況下,是的,它使用相同的w3.org網址。 – sab669