12

Xml ファイルを解析するアプリケーションを作成しています。逆シリアル化を試みる前に Xml を検証するために使用するスキーマ (.xsd) ファイルがあります。

XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add(null, "./xml/schemas/myschema.xsd");
settings.ValidationType = ValidationType.Schema;
XmlReader reader = XmlReader.Create(xmlFile, settings);
XmlDocument document = new XmlDocument();
document.Load(reader);
ValidationEventHandler eventHandler = new ValidationEventHandler(settings_ValidationEventHandler);
document.Validate(eventHandler);

パラメータ *./xml/schemas/myschema.xsd" は、プログラム実行に関連する .xsd へのパスであることに注意してください。

ファイル名/パスを使用したくありません。代わりに、.xsd ファイルをプロジェクトの埋め込みリソースとしてコンパイルします (既に .xsd ファイルを追加し、ビルド アクションを埋め込みリソースに設定しています)。

私の質問は....埋め込みリソース スキーマを XmlReaderSettings スキーマ リストに追加するにはどうすればよいですか? settings.Schemas.Addにはオーバーロードされたメソッドが 4 つありますが、いずれも埋め込みリソースを引数として取りません。それらはすべて、スキーマ ファイルへのパスを取ります。

過去に埋め込みリソースを使用してラベル画像を動的に設定したことがあるので、埋め込みリソースの使用にはある程度慣れています。私の他のコードを見ると、最終的にはコンテンツを含むストリームのように見えます:

System.Reflection.Assembly myAssembly = System.Reflection.Assembly.GetExecutingAssembly();
Stream myStream = myAssembly.GetManifestResourceStream(resourceName);

埋め込まれた .xsd もストリームとして読み込まれると想定しているので、これで質問が少し絞り込まれます。ファイル名ではなくスキーマを含むストリームへの参照がある場合、スキーマを XmlReaderSettings に追加するにはどうすればよいですか?

4

1 に答える 1

19

を 2 番目のパラメーターとしてAdd()受け取るオーバーロードを使用できます。XmlReader

Assembly myAssembly = Assembly.GetExecutingAssembly();
using (Stream schemaStream = myAssembly.GetManifestResourceStream(resourceName)) {
  using (XmlReader schemaReader = XmlReader.Create(schemaStream)) {
    settings.Schemas.Add(null, schemaReader);
  }
}

または、最初にスキーマをロードしてから追加することもできます。

Assembly myAssembly = Assembly.GetExecutingAssembly();
using (Stream schemaStream = myAssembly.GetManifestResourceStream(resourceName)) {
  XmlSchema schema = XmlSchema.Read(schemaStream, null);
  settings.Schemas.Add(schema);
}
于 2013-01-26T23:23:22.503 に答える