2012-03-15 7 views
2

私の目標は、インポートを含む埋め込みxsdをDataSetにロードし、xsdに基づいてテーブルを生成することです。DataSetへのインポートを含む組み込みXSDのロード

インポートされた複数のXSDファイルからなるXMLスキーマを使用してDataSetをロードしようとしています。ファイルシステム上にあるファイルでこれを行うことは問題ありません。私はそれをメインのxsdファイルに渡し、すべてが正常にロードされ、すべてのxsdのインポートが解決されます。私がしたいことは、xsdを自分のdllに埋め込んで、ファイルシステム上に座っていないことです。 xsdファイルが埋め込まれているプロジェクトは、xsdファイルにアクセスしてDataSetにロードするプロジェクトとは別のプロジェクトです。

DataSet.ReadXmlSchemaメソッドは、ストリーム、XmlReader、文字列uri、またはXmlTextReaderのいずれかを使用できます。私はDLLをロードして、メインのスキーマファイルにassembly.GetManifestResourceStream(schemaPath)を使用しても問題はありません。これは、自分のスキーマが1つのファイルであれば問題ありません。問題は、これをDataSet.ReadXmlSchemaメソッドに渡すと、インポートを見つけることができなくなることです。

XmlReaderを使用し、XmlReaderSettingsオブジェクトをカスタムxmlリゾルバで使用しようとしましたが、これまでの問題について書かれていました。過去にカスタムxmlリゾルバを使用して、同様のスキーマをDLLに埋め込んでXmlSchemaSetにロードしていましたが、それは魅力的でした。したがって、私はXmlReader.Create呼び出しを作成するときに、自分のカスタムXmlリゾルバを使用するXmlReaderSettingsを渡しますが、このXmlReaderをDataSet.ReadXmlSchemaメソッドに渡すと、インポートされたスキーマファイルも見つからない可能性があります。私はオーバーロードされたGetEntityメソッドにブレークポイントを設定し、決してヒットしません。したがって、XmlReaderは私が提供したXmlResolverを使用していないようです。私はXmlTextReaderと同じ問題がありました。

埋め込みスキーマを読み込んでデータセットに読み込む方法についてのアイデアはありますか?私の最後の手段は、埋め込まれたxsdファイルをファイルシステムに一時的にコピーしてDataSetを作成してから削除することですが、これを避けようとしています。

答えて

2

残念ながら、いいえ、リソースとして埋め込まれた複数のXSDからDataSetを読み込むことはできません。

正当化は、DataSetクラスのこの方法である:

internal void ReadXSDSchema(XmlReader reader, bool denyResolving)

コードが書かれている方法は、それがXmlSchemaSetを利用します。スキーマを読み込み、それをXmlSchemaSetに追加してコンパイルするために、渡したリーダー(XmlReader)を使用します。

残念ながら、埋め込まれたリソースを使用する際にXmlSchemaSetをコンパイルするために、1 XmlSchemaSetオブジェクトにXMLリゾルバを提供しなければならない!...事があり、その過程でその時点で使用できる1つはありません。読者の設定はリゾルバで設定できますが、わかっているように、それは書き込み専用です(ゲッターはありません)。

私が言ったことをテストするには、同じ埋め込みリソースからXmlSchemaSetを読み込みます。何をしようとしているかに関わらず、リゾルバはXmlReaderレベルではなくXmlSchemasetレベルに設定する必要があります。

例外スタックを見てから、Reflectorなどを使用してコードを確認することをお勧めします。別の結論に達する場合は、共有してください。

+0

残念ながら、私はあなたが正しいと思います。確認していただきありがとうございます。 – user817722

関連する問題