无法验证针对多个XSD架构在C#

问题描述:

我想验证针对其模式定义一个数字签名的XML,而这个模式实际上包含这个标签无法验证针对多个XSD架构在C#

<xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig-core-schema.xsd" id="schema"/> 

然后我试图加载模式:

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.Schemas.Add(null, "a.xsd"); 
settings.Schemas.Compile(); 

我将得到以下错误 'http://www.w3.org/2000/09/xmldsig#:Signature'元素未被声明。

+0

贵XML像XMLSPY工具验证? 如果我没有记错,您应该能够使用XmlReader对导入/包含模式进行验证。 – thijs 2009-10-16 09:57:31

您需要在导入模式也加载另一个

settings.Schemas.Add([importednamespace][pathtoimportedXSD]);

你确定哈希需要在?: http://www.w3.org/2000/09/xmldsig#

+0

它是名称空间URI的一部分,请参阅http://www.w3.org/TR/2002/REC-xmldsig- core-20020212/xmldsig-core-schema.xsd – Richard 2009-10-16 10:25:57

+0

好的,谢谢,还不知道 – dusoft 2009-10-16 10:35:02

末从它似乎XML签名模式没有被加载错误,尽管进口。

将XML签名架构显式添加到架构集应该确认。

最可能的原因是架构集的XmlReslver找不到您指定的文件,这可能是当前文件夹/相对路径问题。

使用Process Monitor来查看您可以尝试加载XSD文件的位置也可能有所帮助。

出于安全考虑,方案xmldsig-core-schema.xsd不收费,因为它引用DTD来验证上传目录并将其添加为另一个方案。

<!DOCTYPE schema PUBLIC "-//W3C//DTD XMLSchema 200102//EN" "http://www.w3.org/2001/XMLSchema.dtd" 

这个作品 的解决方案是C#

XElement xsdMarkup = XElement.Load("C:\\Proyectos\\WindowService\\Sbif\\Schema\\Schema\\IndicadoresFinancieros-v1.0.xsd"); 

XElement xsdMarkup2 = XElement.Load("http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd"); 

XmlSchemaSet schemas = new XmlSchemaSet(); 

schemas.Add(null, xsdMarkup.CreateReader()); 
schemas.Add(null, xsdMarkup2.CreateReader()); 

schemas.Compile();