Я не нашел способа использовать .NET XmlWriter и связанные с ним XmlWriterSettings для форматирования строки XML с отступом в точности так, как это делает Visual Studio с помощью команды автоформатирования (Ctrl-E Ctrl-D или, в зависимости отпри раскладке клавиатуры Ctrl-K Ctrl-D).
Я хотел бы сделать это, потому что я обычно автоматически форматирую все свои файлы в VS, как файлы кода, так и файлы .config.У меня есть приложение-установщик, которое обновляет файлы .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();
}
}
}