【问题标题】:Validating XML file against schema throws exception根据架构验证 XML 文件会引发异常
【发布时间】:2018-06-13 03:30:28
【问题描述】:

我在尝试针对 MVC/ASP.Net Core 中的架构验证 XML 文件时遇到异常错误。

我得到的错误是:

System.Xml.Schema.XmlSchemaValidationException: 'Type 'http://ns.editeur.org/onix/3.0/reference:SourceTypeCode' 未声明,或者不是简单类型。'

我的代码是这样的:

XmlSchemaSet onixschema = new XmlSchemaSet();

XDocument xmlDocument = XDocument.Load(@"path.to.xml.file");

onixschema.Add("http://ns.editeur.org/onix/3.0/reference", @"path.to.ONIX_BookProduct_3.0_reference.xsd");

xmlDocument.Validate(onixschema, (o, e) =>
        {
            validationResult.ErrorMessages.Add(e.Message);
        });

我真的不知道从哪里开始例外。该消息并没有非常有启发性!

真正令人困惑的是,如果我在 WebForms/.Net(相同的文件等)中运行这个确切的代码,它会正确验证。

我没有得到错误。

如果有人能对此有所了解,我将不胜感激。

//编辑

很确定它与 ASP.Net Core 有关。如果我创建一个全新的 MVC/.Net Web 应用程序,并将代码粘贴在 Home Controller 中,它应该可以正常工作。没有验证异常。

如果我创建一个全新的 MVC/ASP.NET Core 应用程序,并将代码粘贴在 Home Controller 中,它会失败,并出现验证异常。

可能与 ASP.NET Core 处理静态 XSD 文件的方式有关吗?

【问题讨论】:

  • XmlSchemaSet Add() 定义如下: public XmlSchema Add(string targetNamespace, string schemaUri);您的添加没有命名空间作为第一个参数。
  • targetNamespace 不是“ns.editeur.org/onix/3.0/reference”吗?除非我遗漏了某些东西,否则我的 add 确实有 2 个参数(请参阅代码)...
  • 两个字符串,但字符串错误。您的第一个参数是一个 URI,它应该是第二个参数。您没有命名空间。
  • 嗨 - 谢谢,但 ONIX 规范的命名空间是一个 URI。来自官方文档:ns.editeur.org/onix/3.0/reference" xmlns:xsi="w3.org/2001/XMLSchema`instance" xsi:schemaLocation="ns.editeur.org/onix/3.0/reference
  • 没有。命名空间 ABC 通常是 xmlns:ABC=="ns.editeur.org/onix/3.0/reference"。省略命名空间时,表示它是默认命名空间。所以在你的情况下,命名空间是 xsi。

标签: c# xml asp.net-core xsd-validation


【解决方案1】:

好的,我已经回答了这个问题。

问题在于 XSD 文件导入了另外两个 XSD 文件。如果我手动导入这些文件并创建一个更大的 XSD 文件,那么问题就会消失。

所以这与 ASP.NET Core 处理相对路径的方式有关。它无法识别有两个 XSD 文件要导入,或者找不到它们(而 Web 窗体和 MVC/.NET 可以这样做)。我还不知道为什么!

【讨论】:

    【解决方案2】:

    消息很清楚:未声明 SourceTypeCode'。

    为确保您的 xml 文件没有任何错误,您可以使用 notepad ++ 上的 XmlTools 对其进行验证。

    如果您没有错误,那么我们可以确定问题出在您的代码中,而不是在文件中。

    Plugins => Xml Tools

    问候,

    【讨论】:

    • 谢谢,但它在 MVC/.Net 应用程序和 Web 窗体应用程序中运行良好。相同的文件,相同的代码。
    • 我认为你的 xml 实际上有 SourceTypeCode 的验证错误。以下网页上的架构不是很有帮助,但示例 xml 可能会对您有所帮助:editeur.org/93/Release-3.0-Downloads
    • 这就是发生的事情。架构引用在两个导入的 XSD 文件中定义的类型。它们没有被导入——我不知道为什么——所以你得到类型未定义的错误。如果将 XSD 文件组合在一起 - 实际上是手动导入 - 错误就会消失,因为现在在 XSD 文件中定义了简单类型。感谢您的所有时间和帮助。赞赏!
    猜你喜欢
    • 1970-01-01
    • 2010-09-08
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多