“http://www.w3.org/XML/1998/namespace:lang”属性未被声明。

18

有时候,当使用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”模式但没有成功吗?

2个回答

11
因为许多DTD和XSD源于W3C,导致许多人试图从其服务器上解析它们,结果使其被大量请求淹没 - 数以百万计的请求。因此他们开始阻止“过度”的请求。
请参见这篇博客文章,其中也适用于XSD。
解决方案是使用本地副本。

我会给你答案,因为我的客户工具链需要schemaLocation存在。谢谢,我以为我要疯了! - roufamatic
1
实际上,位置是schemaLocation的第二个参数,对吧?但是在上面的导入中没有第二个参数。为什么会调用w3网站? - Sai Ram Reddy

7
我相信我已经解决了这个问题。我检查了Fiddler并看到了向w3c.org发送xsd文件的请求。进一步的研究发现此链接;备注#3似乎与我的情况有关。因此,如果由于某种原因我的计算机无法下载XSD文件,则xml命名空间变得不可用。遗憾的是,真正的错误(“无法访问w3c.org”或其他错误)从未报告过。
xs:import中删除schemaLocation就可以解决问题。

1
您还可以将schemaLocation设置为在W3C网站上找到的副本(版权属于他们,但他们不仅允许这样做,而且非常积极地鼓励这样做)。 - Jon Hanna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接