"未声明'http://www.w3.org/XML/1998/namespace:lang'属性."

rou*_*tic 12 c# xml validation xsd xmlreader

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

System.Xml.Schema.XmlSchemaValidationException: 
"The 'http://www.w3.org/XML/1998/namespace:lang' attribute is not declared."
Run Code Online (Sandbox Code Playgroud)

同一文件有时会成功.我无法弄清楚为什么.

我的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" />
 ...
Run Code Online (Sandbox Code Playgroud)

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

<root xmlns="http://mytargetnamespace.com"        
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://mytargetnamespace.com myschema.xsd">
Run Code Online (Sandbox Code Playgroud)

最后,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()) {}
Run Code Online (Sandbox Code Playgroud)

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

我注意到当它试图验证时有一个重要的暂停.这有关系吗?它是否尝试下载实际的"xml.xsd"架构而没有成功?

lav*_*nio 9

由于许多DTD和XSD都来自W3C,因此他们遇到了许多人试图从他们的服务器解决这些问题的问题,导致他们被请求淹没 - 数百万和数百万.所以他们开始阻止"过度"请求.

请参阅此博客条目,该条目也适用于XSD.

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


rou*_*tic 6

我非常有信心解决了这一问题。我检查了Fiddler,并确实看到向w3c.org发送xsd文件的请求。更多的研究证明了这种联系 ; 备注#3似乎与我的情况有关。因此,如果由于某种原因我的计算机无法下载XSD文件,那么xml名称空间将变得不可用。遗憾的是,从未报告过真正的错误(“无法到达w3c.org”或您拥有什么)。

schemaLocation从中删除xs:import该技巧。