如何针对2个XSD验证1个XML文件?

时间:2016-04-22 17:03:51

标签: c# .net xml

我需要一个用户提供的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,第二个架构支持Child1Child3。< / p>

方法CreateXsdCreateXDocValidate只包含教程中的代码。我传递给它的int只会附加到第二个Child元素,因此您有Child1Child2Child3作为第二个元素,具体取决于什么通过。

运行时,Validate(doc1, schemas);因此错误而崩溃:

  

已声明全局元素“Root”。

似乎因为我的两个xsdMarkup变量使用相同的xmlns值,它只是将模式附加到第一个模式。好的,没问题,我只需要更改第二个命名空间... Nope;崩溃是因为URL无效,我不知道我可以替代什么。

因此,假设我说有两个功能模式。我可以调用XmlSchemaSet.Add两次,然后调用XDocument.Validate(myXmlSchemaSetObj, someValidationEventHandlerDefintion);来针对多个模式验证1个文件吗?

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();
}