2011-01-21 91 views
0

我正在尝试使用XmlReader和关联的​​对象在某些文档上执行XSD验证。我声明了一个ValidationEventHandler,我期望在读者遇到验证问题时会调用它。但是,当我尝试创建阅读器时,我得到XSDValidationException.NET XSD验证混淆

任何想法会导致异常?消息是:

System.Xml.Schema.XmlSchemaValidationException:未声明'http://www.w3.org/XML/1998/namespace:base'属性。

对于其中一个底层模式会有问题吗?

+0

什么是整个例外(`ex.ToString()`)?它可能会告诉你行号和位置,甚至可能是文件名。 – 2011-01-21 23:31:28

回答

0

验证您的实际XML文档在没有名称空间中没有根元素。

当您的模式验证具有目标名称空间,但正在验证的XML文档包含没有名称空间的任何根元素时,可能会出现此错误。

不幸的是,在这种情况下的模式验证只会产生一个警告,即它没有为根元素找到匹配的模式,并且只有在设置了报告警告的特定标志时才会显示此警告,验证XmlDocument的方法。

0

在您的模式和文档中搜索​​属性。如果存在,那么定义该属性的模式将需要位于您的模式集中。

0

代码示例本来很好,可以确定你在做什么,但是我可以做出一些假设,因为我在同一个地方。我遇到了Using XSDs with includes,并调整了我接受的答案。

问题是,XmlReader似乎不知道包含的模式的基本路径是什么,如果您没有指定它,而Create()XmlReader。假设您有一个到您的XML文件的文件路径,请使用XmlReader.Create(Stream input, XmlReaderSettings settings, String baseUri)并将XML文件的路径作为baseUri

例子:

using System.IO; 
using System.Xml; 
using System.Xml.Schema; 

public void LoadXml(string path) { 
    XmlDocument doc = new XmlDocument(); 
    XmlReader docReader; 

    XmlReaderSettings rdrOpts = new XmlReaderSettings(); 
    rdrOpts.ValidationType = ValidationType.Schema; 
    rdrOpts.ValidationFlags = XmlSchemaValidationFlags.ProcessSchemaLocation; 

    try { 
     // This line is what you're looking for: 
     docReader = XmlReader.Create(new FileStream(path, FileMode.Open, FileAccess.Read), rdrOpts, Path.GetDirectoryName(path)); 
     doc.Load(docReader); 
    } catch (System.Xml.Schema.XmlSchemaValidationException ex) { 
     //... 
    } //and catch any other relevant exceptions here, like System.IO.FileNotFoundException 
}