我有一个Powershell脚本,用于格式化XML文档。我希望对缩进进行制表,所以我正在使用XmlWriter并将其视为适当的设置传递给它。
但是,结果缩进了空格:
我的功能如下:
function Format-XML ($xml)
{
$stringbuilder = New-Object System.Text.StringBuilder
$settings = New-Object System.Xml.XmlWriterSettings
$settings.Indent = $true
$settings.IndentChars = "`t`t"
$xmlWriter = [System.XML.XmlWriter]::Create($stringbuilder, $settings)
$xml.WriteContentTo($xmlWriter)
$xmlWriter.Close()
return [xml]$stringbuilder.ToString()
}
如果我将$ settings.IndentChars设置为x`t`t
,我会看到它生效-每一行都以x为前缀,并按预期有一对制表符。
为什么仅指定一对制表符时我的IndentChars被忽略?
答案 0 :(得分:2)
尝试一下:
function Format-XML ([xml]$xml)
{
$stringbuilder = New-Object System.Text.StringBuilder
$settings = New-Object System.Xml.XmlWriterSettings
$settings.Indent = $true
$settings.IndentChars = "`t`t"
$xmlWriter = [System.XML.XmlWriter]::Create($stringbuilder, $settings)
$xml.WriteContentTo($xmlWriter)
$xmlWriter.Close()
$xmlDoc = [System.Xml.XmlDocument]::new()
$xmlDoc.PreserveWhitespace = $true
$xmlDoc.LoadXml($stringbuilder.ToString())
return $xmlDoc
}
即该问题是由显式转换为XML引起的,因为原始代码中没有任何内容告诉它保留空白。
上面的更改将创建一个新的XMLDocument,将“保留空白”选项设置为true,然后解析您的字符串并返回生成的XML。
通过XmlWriter上的选项,可能会有更好的方法(如果没有的话,我会感到惊讶),但是我对所需要的内容并不十分了解...
答案 1 :(得分:1)
一种解决方案-上面的方法没有什么问题,但似乎与我保存结果XML的方式一样。
我现在将返回一个字符串,而不是将Format-Xml方法的返回值转换为XML:
#return [xml]$stringbuilder.ToString()
return $stringbuilder.ToString()
导致空格而不是制表符的代码:
$xmlDocument = Format-XML($xmlDocument)
$xmlDocument.Save($filePath)
将Format-Xml的结果作为字符串并产生所需的(选项卡式)输出的新代码是这样的:
$formattedXmlString = Format-XML($xmlDocument)
$formattedXmlString | out-file $filePath
感谢@JohnLBevan将我带入正确的轨道。