针对包含更多XSD的XSD的XML验证:未声明类型

时间:2013-11-27 03:55:15

标签: c# xml xsd

当基础XSD从站点导入其他一些XSD时,我在验证XML对XSD时遇到问题。例如,对于以下XSD项,它会抛出错误。

<link:linkbase xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:link = 'http://www.xbrl.org/2003/linkbase' xmlns:xbrli = 'http://www.xbrl.org/2003/instance' xmlns:xlink = 'http://www.w3.org/1999/xlink' xsi:schemaLocation = 'http://www.xbrl.org/2003/linkbase http://www.xbrl.org/2003/xbrl-linkbase-2003-12-31.xsd' >

是否有任何解决方案可以通过DLL的发行版导入XSD。我正在使用以下C#代码来验证针对XSD的XML。当我通过Visual Studio执行它时,它也一样。

var schemas = new XmlSchemaSet();
schemas.Add(null, xsdFilePath);

var readerSettings = new XmlReaderSettings();
readerSettings.ValidationType = ValidationType.Schema;
readerSettings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
readerSettings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
readerSettings.Schemas.Add(schemas);

using (var xmlReader = XmlReader.Create(xmlFilePath, readerSettings))
{
    while (xmlReader.Read())
    {
    }  
}

1 个答案:

答案 0 :(得分:1)

显然,解析器找不到架构xbrl-instance-2003-12-31。来自w3 schema specs

  

xsi:schemaLocation)使用URI引用对记录作者的权证(一个用于命名空间名称,一个用于提示定义该命名空间名称的模式文档的位置)

也就是说,schemaLocation定义的第一部分xbrl.org/2003/xbrl-instance-2003-12-31.xsd 是命名空间。如果解析器还不知道在哪里找到此类命名空间的架构,则必须为其提供位置。例如:

<xs:import
    namespace='xbrl.org/2003/instance'
    schemaLocation='xbrl.org/2003/xbrl-instance-2003-12-31.xsd http:/xbrl.org/2003/xbrl-instance-2003-12-31.xsd'/>