.NET の XmlWriter と関連する XmlWriterSettings を使用して、Visual Studio が自動フォーマット コマンド (Ctrl-E Ctrl-D、またはキーボード マッピングによっては、Ctrl-K Ctrl-D)。
コードと.configファイルの両方で、VSのすべてのファイルを習慣的に自動フォーマットするため、これを行いたいと思います。.config ファイルを更新するインストーラー アプリがあり、変更されたドキュメント全体ではなく、実際の差分を確認したいと考えています。
自動フォーマットのさまざまなフォーマットオプションをすべて調べたわけではありませんが、次のように、各 XML 属性を別の行に配置し、最初のタグを開始タグと同じ行に配置し、後続の属性を最初のタグと並べて配置するのが好きです。 :
<asset assetId="12345"
bucket="default"
owner="nobody">
<file path="\\localhost\share\assetA.mov"/>
<metadata metadataId="23456"
key="asset_type"
value="video"/>
</asset>
XmlWriterSettings プロパティ 'NewLineHandling = NewLineHandling.None' および 'NewLineOnAttributes = true' で書式設定を試みましたが、最初の属性が開始タグの下に配置され、要素名の文字数に関係なく、すべての属性が同じインデントになります。このような:
<asset
assetId="12345"
bucket="default"
owner="nobody">
<file
path="\\localhost\share\assetA.mov" />
<metadata metadataId="23456"
key="asset_type"
value="video" />
</asset>
標準の XmlWriter では、属性のみの要素も " />" (スラッシュの前に余分なスペース) で終了していることに注意してください。これは嫌いですが、それが XML 標準かどうかはわかりません。Visual Studio は、開発者がすぐに利用できるものと同じ API オプションを使用していると思いますが、それらの魔法の設定をまだ見つけていません。とにかく、ここに私のフォーマット方法があります:
public static string FormatXml( string xmlString, bool indented )
{
using ( TextReader textReader = new StringReader( xmlString ) )
using ( XmlReader xmlReader = new XmlTextReader( textReader ) )
{
using ( TextWriter textWriter = new StringWriter() )
{
var settings = new XmlWriterSettings();
if ( indented )
{
settings.Indent = true;
settings.IndentChars = " ";
settings.NewLineOnAttributes = true;
settings.NewLineHandling = NewLineHandling.None;
}
using ( var xmlWriter = XmlWriter.Create( textWriter, settings ) )
{
while ( xmlReader.Read() )
xmlWriter.WriteNode( xmlReader, false );
}
return textWriter.ToString();
}
}
}