我没有找到一种方法使用.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>
Run Code Online (Sandbox Code Playgroud)
我尝试使用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>
Run Code Online (Sandbox Code Playgroud)
请注意,标准的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 = …Run Code Online (Sandbox Code Playgroud) 首先,我知道我可以定义两个重载的辅助方法来做我需要的东西(或者甚至只是用不同的名称定义两个Func <>),但这些只用于一个公共方法,所以我正在探索方法定义两个本地Func <>,它们也使用相同的名称重载.举个例子:
string DisplayValue(int value)
{ return DisplayValue(value, val => val.ToString()); }
string DisplayValue(int value, Func<int, string> formatter)
{ return (value < 0) ? "N/A" : formatter(value); }
Run Code Online (Sandbox Code Playgroud)
我需要在我的公共方法中多次调用一个或另一个版本来自定义格式化特殊值,所以我想我可以将上面的"翻译"成这样的东西:
Func<int, Func<int, string>, string> displayValue =
(value, formatter) => (value < 0) ? "N/A" : formatter(value);
Func<int, string> displayValue =
value => displayValue(value, val => val.ToString());
Run Code Online (Sandbox Code Playgroud)
即使在我输入它时,我也知道我无法声明两个具有相同名称的委托标识符,即使它们是不同的类型.这比使用Func <> s实现重载的死机更为学术,但我猜他们不能做任何事情,对吧?
而且我想你不能做这样的事情:
Func<string, params object[], string> formatArgs =
(format, args) => string.Format(format, args);
Run Code Online (Sandbox Code Playgroud)