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



当基础XSD从站点导入一些其他XSD时,我在根据XSD验证XML时遇到问题。例如,对于下面的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())
    {
    }  
}

显然,解析器找不到模式xbrl-instance-2003-12-31。根据w3模式规范:

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'/>

最新更新