2010-01-23 85 views
0

我已经从http://www.w3.org/2001/XMLSchema.xsd下载了官方的“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

你需要一对夫妇在架构中引用的其他文件:

XmlSchema.dtddatatypes.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()) ; 
     } 
    } 
} 
+0

当我手动删除DTD声明时,它工作时,我明确地添加它(和你一样)。但是当我读取另一个引用它的文档时,我仍然在架构模式本身上得到这些验证错误 – 2010-01-23 18:39:43