【问题标题】:.NET XSD validation confusion.NET XSD 验证混淆
【发布时间】:2011-01-21 22:45:12
【问题描述】:

我正在尝试使用XmlReader 和关联的XmlReaderSettings 对象对某些文档执行XSD 验证。我声明了一个ValidationEventHandler,我希望每当读者遇到验证问题时都会调用它。但是,当我尝试创建阅读器时,我收到了 XSDValidationException

知道什么会导致异常吗?消息是:

System.Xml.Schema.XmlSchemaValidationException:未声明“http://www.w3.org/XML/1998/namespace:base”属性。

其中一个底层架构是否存在问题?

【问题讨论】:

  • 整个异常是什么 (ex.ToString())?它可能会告诉您行号和位置,甚至可能会告诉您文件名。

标签: c# xml validation exception


【解决方案1】:

验证您的实际 XML 文档在没有命名空间中没有根元素。

当您的架构验证具有目标命名空间但正在验证的 XML 文档包含任何没有命名空间的根元素时,可能会出现此错误。

不幸的是,在这种情况下,架构验证只会生成一个警告,即它没有为根元素找到匹配的架构,并且该警告仅在设置了报告警告的特定标志时才会显示,而使用 Validate 时未设置该标志XmlDocument 的方法。

【讨论】:

    【解决方案2】:

    在您的架构和文档中搜索xml:base 属性。如果存在,那么定义该属性的架构将需要在您的架构集中。

    【讨论】:

      【解决方案3】:

      代码示例可以很好地确定您在做什么,但我可以做出一些假设,因为我在同一个地方。我遇到了Using XSDs with includes 并调整了接受的答案以适合我。

      问题是XmlReader 似乎不知道包含架构的基本路径是什么,如果您在Create()XmlReader 时没有指定它。假设您有 XML 文件的文件路径,请使用 XmlReader.Create(Stream input, XmlReaderSettings settings, String baseUri) 并将 XML 文件的路径提供为 baseUri

      例子:

      using System.IO;
      using System.Xml;
      using System.Xml.Schema;
      
      public void LoadXml(string path) {
          XmlDocument doc = new XmlDocument();
          XmlReader docReader;
      
          XmlReaderSettings rdrOpts = new XmlReaderSettings();
          rdrOpts.ValidationType = ValidationType.Schema;
          rdrOpts.ValidationFlags = XmlSchemaValidationFlags.ProcessSchemaLocation;
      
          try {
              // This line is what you're looking for:
              docReader = XmlReader.Create(new FileStream(path, FileMode.Open, FileAccess.Read), rdrOpts, Path.GetDirectoryName(path));
              doc.Load(docReader);
          } catch (System.Xml.Schema.XmlSchemaValidationException ex) {
              //...
          } //and catch any other relevant exceptions here, like System.IO.FileNotFoundException
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-10
        • 2022-08-13
        • 1970-01-01
        • 2022-06-16
        • 1970-01-01
        • 2018-06-04
        • 2011-03-22
        • 1970-01-01
        相关资源
        最近更新 更多