1

视觉工作室 2005、.NET 2.0

我正在开发一种消息传递服务,该服务基于我无法修改的第 3 方模式文件发送和接收 xml 消息。(我已经验证了架构是有效的,并使用 Altova 的 XMLSpy 生成了一个示例 xml 消息。)我发现处理这个要求的最佳解决方案是创建一个基于架构的数据集,然后使用 DataSet.ReadXml( )。DataSet.WriteXml() 应该能够在创建消息时使用。

当我过去从 .xsd 文件构建数据集时,我使用了 MSDataSetGenerator 自定义工具。但是,架构文件在通过 MSDataSetGenerator 运行时出现错误,并出现错误:

自定义工具错误:无法生成代码。无法将输入 xml 文件内容转换为 DataSet。未声明“http://www.w3.org/2000/09/xmldsig#:KeyInfo”元素。

以下是与架构文件中的数字签名/KeyInfo/Signature 相关的行。

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

在文件中,它进一步引用了该架构中定义的 2 个对象:

<xs:element ref="ds:Signature" minOccurs="0"/>
<xs:element ref="ds:KeyInfo" minOccurs="0"/>

我还尝试通过执行以下操作加载架构:

DataSet ds = new DataSet();
ds.ReadXmlSchema("schema.xsd");

但这也会引发关于未声明 KeyInfo 的相同错误。

是否有另一种方法来创建我缺少的数据集,或者我需要设置一个选项才能使用 MSDataSetGenerator?或者有没有人知道更好的方法来整体设置它,而不是使用基于提供的模式的数据集?

4

1 回答 1

0

W3C 的原始 XML 签名模式文件在顶部包含一个 DTD 标头,我想是为了与旧的 XML 解析器兼容。显然 .Net 模式阅读器不喜欢这样。最简单的解决方案是注释掉从

<!DOCTYPE ...

]>.

于 2015-04-21T18:25:57.803 回答