为什么在Powershell的XmlWriter中忽略我的缩进设置?

时间:2018-10-18 10:36:41

标签: xml powershell

我有一个Powershell脚本,用于格式化XML文档。我希望对缩进进行制表,所以我正在使用XmlWriter并将其视为适当的设置传递给它。

但是,结果缩进了空格:

实际结果:
The actual result, with spaces

所需结果:
The desired result, with tabs

我的功能如下:

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被忽略?

2 个答案:

答案 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将我带入正确的轨道。