我需要用戶提供的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();
}
期望輸出:雙方應驗證作爲第一個架構支持Child1
Child2
,而第二個架構支持Child1
,Child3
。
方法CreateXsd
,CreateXDoc
和Validate
只包含教程中的代碼。 int
我傳遞給它只是附加到第二個Child
元素,所以你有Child1
和Child2
或Child3
作爲第二個元素,這取決於傳遞的內容。
當我運行此,Validate(doc1, schemas);
崩潰,出現此錯誤:
The global element 'Root' has already been declared.
這似乎是因爲我的兩個xsdMarkup
變量使用相同的xmlns
價值,它只是附加的模式到第一模式。好的,沒問題,我只是改變第二個命名空間......不;由於URL無效而崩潰,我不知道我可以替代什麼。
所以,假設說,我有兩個功能模式。我可以撥打XmlSchemaSet.Add
兩次,然後致電XDocument.Validate(myXmlSchemaSetObj, someValidationEventHandlerDefintion);
驗證1個文件是否符合多個模式?
這可能行得通,我馬上試試。但是'XmlSchema'和'XmlSchemaSet'有什麼區別?我認爲後者將是一個容器,對於'XmlSchema'對象的集合不是?我想你可以基本上存儲一些模式來單獨驗證。似乎相反,直覺必須爲每個我想要驗證的模式創建一個單獨的Set對象... – sab669
我認爲這對你來說很重要,因爲你指定「」作爲targetNamespace兩次。 https://msdn.microsoft.com/en-us/library/1hh8b082(v=vs.110).aspx – montewhizdoh
這是行不通的。雖然我不明白爲什麼我必須這樣做,但如果它起作用,那就是重要的。空引號(或null)強制它使用XSD中定義的名稱空間。在這種情況下,是的,它使用相同的w3.org網址。 – sab669