【问题标题】:Cannot validate against multiple xsd schemas in C#无法针对 C# 中的多个 xsd 模式进行验证
【发布时间】:2010-12-07 07:44:33
【问题描述】:

我想根据它的架构定义验证一个数字签名的 xml,而这个架构实际上包含这个标签

<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' 元素未声明。

【问题讨论】:

  • 您的 XML 是否在 XmlSpy 之类的工具中验证?如果我没记错的话,您应该能够使用 XmlReader.. 验证导入/包含的架构

标签: c# xml validation schema


【解决方案1】:

出于安全原因,方案 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();

【讨论】:

  • Add(null, reader) 而不仅仅是 Add(reader) 对我来说是至关重要的变化。谢谢!
【解决方案2】:

您还需要使用另一个加载导入的架构

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

【讨论】:

    【解决方案3】:

    从错误看来,XML 签名架构没有被加载,尽管导入了。

    将 XML 签名模式显式添加到模式集中应该可以确认这一点。

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

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

    【讨论】:

      【解决方案4】:

      您确定在结尾处需要哈希吗?: http://www.w3.org/2000/09/xmldsig#

      【讨论】:

      猜你喜欢
      • 2014-07-13
      • 1970-01-01
      • 2011-02-07
      • 2014-07-16
      • 1970-01-01
      • 2012-09-20
      • 2021-04-11
      • 1970-01-01
      • 2018-07-03
      相关资源
      最近更新 更多