我需要一个用户提供的XML文件来匹配2个可能的模式中的一个。
按照本教程,我们的“真正的”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
。< / p>
方法CreateXsd
,CreateXDoc
和Validate
只包含教程中的代码。我传递给它的int
只会附加到第二个Child
元素,因此您有Child1
和Child2
或Child3
作为第二个元素,具体取决于什么通过。
运行时,Validate(doc1, schemas);
因此错误而崩溃:
已声明全局元素“Root”。
似乎因为我的两个xsdMarkup
变量使用相同的xmlns
值,它只是将模式附加到第一个模式。好的,没问题,我只需要更改第二个命名空间... Nope;崩溃是因为URL无效,我不知道我可以替代什么。
因此,假设我说有两个功能模式。我可以调用XmlSchemaSet.Add
两次,然后调用XDocument.Validate(myXmlSchemaSetObj, someValidationEventHandlerDefintion);
来针对多个模式验证1个文件吗?
答案 0 :(得分:1)
我认为它失败了,因为你指定&#34;&#34;两次都是targetNamespace。听起来你还在开发这个项目,所以我们可以让你为这个节目打补丁#34;暂时断开逻辑。
P.S。您也可以尝试传递空值而不是&#34;&#34;作为上面代码中的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();
}