5

我在 C# 中创建了最简单的 Web 服务:

public void AddData(DataSet ds)

生成的模式 (Wsdl) 如下所示:

<s:schema xmlns:s="http://www.w3.org/2001/XMLSchema">
...
<s:element ref="s:schema" />
...
</s:schema>

请注意,架构不包含任何导入/包含元素。

我正在尝试将此架构加载到 ac# System.Xml.XmlSchema 并将其添加到 System.Xml.XmlSchemaSet:

var set = new XmlSchemaSet();
var fs = new FileStream(@"c:\temp\schema.xsd", FileMode.Open);
var s = XmlSchema.Read(fs, null);
set.Add(s);            
set.Compile();

最后一行抛出此异常:

The 'http://www.w3.org/2001/XMLSchema:schema' element is not declared.

这有点道理:.Net 生成的模式使用“s:schema”类型,该类型在未导入的模式中声明。

  1. 为什么 .Net 会创建无效架构?
  2. 无论如何如何编译架构?我所做的是在http://www.w3.org/2001/XMLSchema中下载架构并将其添加到 XmlSchemaSet 中。这不起作用,因为该在线模式包含 DTD 定义。我不得不手动删除它,现在一切正常。这有意义还是我错过了什么?
4

2 回答 2

2
  1. 我会称之为错误。尽管从http://www.w3.org/2001/XMLSchema命名空间中看到 XML Schema 引用元素是非常不寻常的。
  2. 您所做的是正确的方法-几乎;通常,您应该能够编译使用 DOCTYPE 引用的 XML Schema 文件;只需确保 DTD 在指定位置可用(或通过 XML 解析器可用),并且您的阅读器设置配置为不禁止 DTD 处理(XmlReaderSettings 上已过时的 ProhibitDtd 或 DtdProcessing 属性,默认情况下为 true)。
于 2011-08-24T00:31:58.943 回答
-1

这意味着该服务没有足够的信息来为元素构建有意义的格式,因此它生成的 WSDL 本质上是说“我将发送某种 XML,但我不知道它会是什么样子”。我们需要进一步构建服务的结构,以便 WSDL 生成器可以创建有意义的模式。

于 2015-01-09T19:59:34.967 回答