鷲ノ巣

C# とか PowerShell とか。当ブログの記事は(特に公開直後は)頻繁に改定される場合があることをご了承ください。

Visual Studio に XML スキーマを追加する

Visual StudioXML エディターとしても優れた機能を持っています。
タグの補完などはもちろんのこと、XML スキーマがあれば、インテリセンスやエラーチェックも働きます。

Visual Studio をインストールすると、VS インストール ディレクトリ下の Xml\Schemas ディレクトリに、多数の XML スキーマがインストールされます。
ここには、.NET アプリケーションで使われる .config ファイルをはじめとして、Visual Studio で良く使われるスキーマが置かれます。
f:id:aetos382:20141102170927p:plain

このディレクトリ以外にスキーマがある場合、参照して追加してやることで、そのスキーマを利用することが可能です。
例えば、PowerShell のヘルプを書くために PSMaml スキーマを参照するとか、ETW のプロバイダーを書くためにマニフェストスキーマが欲しいとかいう場合です。
f:id:aetos382:20141102155833p:plain
f:id:aetos382:20141102155847p:plain

しかし、VS を開く度に毎回追加するのは面倒なもの。
どうにかして楽をする方法はないでしょうか。

VS のオプションで [テキスト エディター] > [XML] > [その他] を見ると、このスキーマ ディレクトリのパスがあります。
f:id:aetos382:20141102165738p:plain
が、これはどうやら 1 つしか指定できない様子。不便ですね…。

複数の場所を最初から参照させておくことは、実は、あるファイルを編集することで、実現が可能です。
詳細は MSDN を参照して頂きたいですが、簡単に言うと、スキーマ ディレクトリの中にある catalog.xml ファイルにスキーマ ファイルの場所を書き足してやることで、最初からファイルが参照された状態にすることができ、XML ファイルを開くだけでインテリセンスやエラーチェックが効く状態になります。

さて、catalog.xml に .xsd ファイルのフルパスを書いてもいいのですが、どうやら環境変数が使えるようです。
しかし、ここで使用できる環境変数は、システムのものと若干違うようです。
System とか Programs なんてのはシステムの環境変数にはありませんし、InstallDir や LCID は Visual Studio のバージョンや設定によっても変わります。
さらに不親切なことに、このページにはこれらの変数について解説が全くありません。
手探りで使うしかなさそうです。

とりあえず、ETW のプロバイダー マニフェストと、PowerShell の PSMaml が追加できれば良しとしましょう。
ETW のマニフェスト スキーマは Program Files(x86)\Windows Kits 以下、PowerShell の PSMaml スキーマWindows\System32\WindowsPowerShell 以下にありますので、%ProgramFiles% と %System% を使ってみましょう。

結論から言いますと、ETW マニフェストの方は

<Schema href="%ProgramFiles%/Windows Kits/8.1/Include/um/eventman.xsd" targetNamespace="http://schemas.microsoft.com/win/2004/08/events" />

PSMaml の方はたくさんありますので一部抜粋しますが、

<Schema href="%System%/WindowsPowerShell/v1.0/Schemas/PSMaml/developerCommand.xsd" targetNamespace="http://schemas.microsoft.com/maml/dev/command/2004/10" />

という記述を足してやれば可能でした。
PSMaml の方は名前空間も複数ありますので、組み合わせを間違えないように気を付けてください。