【问题标题】:"The 'http://www.w3.org/XML/1998/namespace:lang' attribute is not declared."“未声明 'http://www.w3.org/XML/1998/namespace:lang' 属性。”
【发布时间】:2011-09-01 08:05:06
【问题描述】:

有时,在使用 XmlValidatingReader 验证某些 XML 文档时,我收到以下错误:

System.Xml.Schema.XmlSchemaValidationException: 
"The 'http://www.w3.org/XML/1998/namespace:lang' attribute is not declared."

同一文档有时会成功。我不知道为什么。

我的 XSD 像这样导入架构:

<xs:schema id="myschemaId"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       targetNamespace="http://mytargetnamespace.com"
       xmlns="http://mytargetnamespace.com"
       xmlns:mm="http://mytargetnamespace.com"
       elementFormDefault="qualified">
 <xs:import namespace="http://www.w3.org/XML/1998/namespace" 
            schemaLocation="http://www.w3.org/2001/xml.xsd" />
 ...

在 XML 文档中我有以下属性:

<root xmlns="http://mytargetnamespace.com"        
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://mytargetnamespace.com myschema.xsd">

最后是 XmlReaderSettings:

const XmlSchemaValidationFlags validationFlags =
          XmlSchemaValidationFlags.ProcessInlineSchema |
          XmlSchemaValidationFlags.ProcessSchemaLocation |  
          XmlSchemaValidationFlags.ReportValidationWarnings |
          XmlSchemaValidationFlags.AllowXmlAttributes;

// Set the validation settings.
var settings = new XmlReaderSettings
                   {
                       ValidationType = ValidationType.Schema,
                       ValidationFlags = validationFlags,
                       DtdProcessing = DtdProcessing.Parse
                   };
settings.ValidationEventHandler += OnValidationEventHandler;

// Create the XmlReader object.
var reader = XmlReader.Create(_xmlFilePath, settings);

// Parse the file. 
while (reader.Read()) {}

这是一个在 Windows 2003 上运行 .NET 4.0 的独立 exe。

我注意到它在尝试验证时会出现明显的停顿。这可能有关系吗?是否尝试下载实际的“xml.xsd”架构但没有成功?

【问题讨论】:

    标签: c# xml validation xsd xmlreader


    【解决方案1】:

    因为许多 DTD 和 XSD 源自 W3C,所以它们存在许多人试图从他们的服务器解决它们的问题,导致它们被请求淹没 - 数以百万计的请求。所以他们开始阻止“过多”的请求。

    参见this blog entry,它也适用于 XSD。

    解决方案是使用本地副本。

    【讨论】:

    • 我正在给你答案,因为我客户的工具链要求 schemaLocation 存在。谢谢,我以为我要疯了!
    • 其实location就是schemaLocation的第二个参数吧? ``` w3.org/XML/1998/namespace" schemaLocation="w3.org/2001/xml.xsd" /> ``` 但是上面的导入没有第二个参数。为什么它会调用 w3 站点?
    【解决方案2】:

    我非常有信心我已经解决了这个问题。我检查了 Fiddler 并确实看到了向 w3c.org 发送 xsd 文件的请求。更多的研究出现了this link;评论#3似乎与我的情况有关。因此,如果由于某种原因我的机器无法下载 XSD 文件,那么 xml 命名空间将变得不可用。遗憾的是,真正的错误(“无法访问 w3c.org”或你有什么)从未被报告。

    从xs:import 中删除schemaLocation 就成功了。

    【讨论】:

    • 您还可以将 schemaLocation 设置为在 W3C 网站上找到的副本(他们的版权,但他们不仅允许这样做,而且非常积极地鼓励这样做)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多