当基础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'/>