有时 ,在使用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”架构而没有成功?
答案 0 :(得分:8)
由于许多DTD和XSD都来自W3C,因此他们遇到了许多人试图从他们的服务器解决这些问题的问题,导致他们被请求淹没 - 数以百万计。所以他们开始阻止“过度”请求。
请参阅this blog entry,这也适用于XSD。
解决方案是使用本地副本。
答案 1 :(得分:3)
我非常有信心我已经解决了这个问题。我检查了Fiddler并确实看到了向w3c.org发送xsd文件的请求。更多的研究出现了this link;评论#3似乎与我的情况有关。因此,如果由于某种原因我的机器无法下载XSD文件,那么xml命名空间就变得不可用了。可悲的是,从未报告过真正的错误(“无法访问w3c.org”或有什么内容)。
从schemaLocation
删除xs:import
就可以了。