2010-03-07 27 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