我已经从http://www.w3.org/2001/XMLSchema.xsd下载了官方的“xsd架构”。
我在本地保存并尝试使用此代码进行验证:
var sc = XmlSchema.Read(new FileStream(@"c:\temp\xsd.xsd", FileMode.Open), validate);
sc.Compile(validate);
它失败了,因为它无法找到某些DTD。
问题1 :为什么xsd的架构包含xml验证器无法处理的定义?
我从文件顶部删除了DTD定义,我得到了这个(以及更多)验证错误:
"Restriction of 'anySimpleType' is not allowed."
问题2 :为什么编译xsd的架构会失败?
我使用set.Add(...)和工作尝试使用XmlSchemaSet。
问题3 :验证XmlSchema和XmlSchemaSet有什么区别?
然后我创建了一个从磁盘导入xsd架构的虚拟架构:
<s:import namespace="http://www.w3.org/2001/XMLSchema" schemaLocation="c:\temp\xsd.xsd" />
当我将此架构添加到架构集时,它会再次失败并出现与上述相同的错误。
问题4 :为什么与直接添加xsd架构(有效)有什么不同?
答案 0 :(得分:0)
您需要使用架构引用的其他几个文件:
XmlSchema.dtd和datatypes.dtd。下载后,您可以验证:
class Program
{
static void Main()
{
var settings = new XmlReaderSettings();
settings.ProhibitDtd = false;
using (var reader = XmlReader.Create("XMLSchema.xsd", settings))
{
settings.Schemas.Add(XmlSchema.Read(reader, null));
}
using (var reader = XmlReader.Create("xsd.xsd", settings))
{
// This will throw if the XML file is not valid
while (reader.Read()) ;
}
}
}