2010-03-07 25 views
5

我创建了简单的Web服务在C#:如何编译使用DataSet(xs:schema)的模式?

public void AddData(DataSet ds) 

生成的模式(WSDL)看起来是这样的:

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

注意的架构不包含任何进口/ include元素。

我试图加载此模式为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定义,因此这不起作用。我不得不手动删除它,现在所有的作品。这是有道理的,还是我错过了什么?

回答

2
  1. 我会称之为错误。看到来自http://www.w3.org/2001/XMLSchema名称空间的XML Schema引用元素是非常罕见的。
  2. 你所做的是正确的方式 - 差不多;通常,您应该能够编译使用DOCTYPE引用的XML模式文件;只要确保该DTD可在指定的位置(或可通过一个XML解析器)和你的读者设置配置不禁止DTD处理(无论是废弃ProhibitDtd或DtdProcessing性能上XmlReaderSettings,默认的是真实的)。
-1

这意味着该服务没有足够的信息来建立元素的有意义的格式,因此它会产生一个WSDL基本上说:“我会送某种XML,但我不知道它会是什么喜欢。”我们需要更多地构建服务的结构,以便WSDL生成器可以创建一个有意义的模式。

+0

否,则表示该服务将返回一个'DataSet'。这不是一个好主意。预计Java客户端如何处理DataSet。通常,不要在Web服务的合约中使用任何.NET特定的类型。 – 2015-01-10 01:29:33