如何编译使用DataSet(xs:schema)的模式?

时间:2010-03-07 15:44:18

标签: xml xsd xmlschemaset

我在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>

请注意,架构不包含任何import / include元素。

我正在尝试将此架构加载到c#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定义。我不得不手动删除它,现在一切正常。这有意义还是我错过了什么?

2 个答案:

答案 0 :(得分:2)

  1. 我称之为bug。虽然看到XML Schema引用http://www.w3.org/2001/XMLSchema命名空间中的元素是非常不寻常的。
  2. 你所做的是正确的方式 - 几乎;通常,您应该能够编译使用DOCTYPE引用的XML Schema文件;只需确保DTD在指定位置可用(或通过XML解析器提供),并且您的阅读器设置配置为不禁止DTD处理(XmlReaderSettings上已废弃的ProhibitDtd或DtdProcessing属性,默认情况下为真)。 / LI>

答案 1 :(得分:-1)

这意味着该服务没有足够的信息来为元素构建有意义的格式,因此它生成一个WSDL,基本上就是说&#34;我会发送一些XML,但我不知道它会是什么样子。&#34;我们需要更多地构建服务的结构,以便WSDL生成器可以创建有意义的模式。