当基础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())
{
}
}
答案 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'/>