【发布时间】:2016-04-22 17:03:51
【问题描述】:
我需要一个用户提供的 XML 文件来匹配 2 个可能的模式中的 1 个。
按照本教程,我们的“真正的”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,第二个架构支持Child1、Child3。
CreateXsd、CreateXDoc 和 Validate 方法仅包含教程中的代码。我传递给它的 int 只是被附加到第二个 Child 元素,所以你有 Child1 和 Child2 或 Child3 作为第二个元素,具体取决于传递的内容。
当我运行它时,Validate(doc1, schemas); 崩溃并出现以下错误:
全局元素 'Root' 已被声明。
似乎因为我的两个 xsdMarkup 变量使用相同的 xmlns 值,它只是将架构附加到第一个架构。好的,没问题,我将更改第二个的命名空间...不;崩溃是因为 URL 无效,我不知道可以用什么代替。
因此,假设我有两个有效的模式。我可以调用XmlSchemaSet.Add 两次然后调用XDocument.Validate(myXmlSchemaSetObj, someValidationEventHandlerDefintion); 来针对多个架构验证一个文件吗?
【问题讨论】: