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>

スキーマには import/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定義が含まれているため、これは機能しませんでした。手動で削除する必要がありましたが、現在はすべて機能しています。これは理にかなっていますか、それとも何か不足していますか?
4

2 に答える 2

2
  1. 私はそれをバグと呼ぶでしょう。ただし、 http://www.w3.org/2001/XMLSchema名前空間の要素を参照するXMLスキーマを確認することは非常にまれです。
  2. あなたがしたことは正しい方法です-ほとんど; 一般に、DOCTYPE参照を使用するXMLスキーマファイルをコンパイルできるはずです。DTDが指定された場所で利用可能(またはXMLリゾルバーを通じて利用可能)であり、リーダー設定がDTD処理を禁止しないように構成されていることを確認してください(XmlReaderSettingsの廃止されたProhibitDtdまたはDtdProcessingプロパティ。デフォルトではこれらはtrueです)。
于 2011-08-24T00:31:58.943 に答える