【问题标题】:How to validate 1 XML file against 2 XSD's?如何针对 2 个 XSD 验证 1 个 XML 文件?
【发布时间】: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,第二个架构支持Child1Child3

CreateXsdCreateXDocValidate 方法仅包含教程中的代码。我传递给它的 int 只是被附加到第二个 Child 元素,所以你有 Child1Child2Child3 作为第二个元素,具体取决于传递的内容。

当我运行它时,Validate(doc1, schemas); 崩溃并出现以下错误:

全局元素 'Root' 已被声明。

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

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

【问题讨论】:

    标签: c# .net xml


    【解决方案1】:

    我认为它对您来说失败了,因为您两次都将“”指定为targetNamespace。听起来你还在开发这个项目,所以我们现在可以通过打破逻辑让你“为演出做好准备”。

    附:您也可以尝试在上面的代码中传递一个空值而不是 "" 作为 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();
    }
    

    【讨论】:

    • 这可能行得通,我马上试试。但是XmlSchemaXmlSchemaSet 之间有什么区别?我认为后者将是某种容器,用于XmlSchema 对象的集合,不是吗?我想你基本上可以存储一些模式来单独验证。必须为我要验证的每个模式创建一个单独的 Set 对象似乎相当反直觉......
    • 我认为这对你来说很糟糕,因为你将 "" 指定为 targetNamespace 两次。 msdn.microsoft.com/en-us/library/1hh8b082(v=vs.110).aspx
    • 这确实有效。虽然我不明白为什么我必须这样做,但如果它有效,那才是最重要的。空引号(或 null)强制它使用在 XSD 本身中定义的命名空间。在这种情况下,是的,它使用相同的 w3.org URL。
    • 是的,这就是我的目标,请参阅我上面关于 targetNamespace 的评论
    • 我想知道这是否是文档中的错误。如果您查看XmlSchemaSet.Add(string, XmlReader),它会声明“nullString.Empty”,而不是XmlSchemaSet.Add(string, string),它只指定null。或者这两种方法实际上略有不同。
    猜你喜欢
    • 2014-02-05
    • 2012-09-20
    • 2021-04-11
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    相关资源
    最近更新 更多