格式化preservewhitespace时,保存XML不会格式化新节点

时间:2017-07-16 21:22:23

标签: xml powershell

获得了一个包含大量空白格式的大型XML。我需要在XML中添加一些节点。我可以用$xml.PreserveWhiteSpace = $true加载XML,然后保存XML文件,保存加载的空白区域。

但是,如果我向加载的XML添加新节点(使用.AppendChild),则在保存文件时,此新节点将全部写入1行。

如果我在加载源文件时关闭PreserveWhiteSpace,我的新节点会正确保存并带有空格和缩进。但是,所有原始文件空白区域都将丢失。

如何使用PreserveWhiteSpace加载XML并添加新节点,新节点为每个元素添加适当的新行?

加载代码:

$xmlitems = New-Object Xml
$xmlitems.PreserveWhitespace = $true
$xmlitems.Load($7items_xml)

以下是添加新节点(元素)代码的一部分:

$newrec = $xmlitems.CreateElement("item")
$xmlitems.Items.AppendChild($newrec) | Out-Null
$newrec.SetAttribute("id", $maxid)
$newrec.SetAttribute("name", "plantFibertankTop")

saveXml $xmlitems $7items_xml

保存代码 - $xmlitems$7items_xml(文件名)传递给此函数:

function saveXml([xml]$xml_data,[string]$xml_file){
    Write-Host "Saving $xml_file"
    $enc = New-Object System.Text.UTF8Encoding($false)
    $wrt = New-Object System.XML.XMLTextWriter($xml_file, $enc)
    $wrt.Formatting = 'Indented'
    $wrt.Indentation = 4
    $xml_data.Save($wrt)
    $wrt.Close()
}

注意:此XML输入和create元素都是有效的XML并且正常工作,格式除外。

重复和总结:如何在加载的XML文件中保留空格,并为我添加的任何新节点/元素获取缩进/格式?我的测试让我相信我只能拥有1而不是两者。

1 个答案:

答案 0 :(得分:0)

到目前为止,我最好的方法是两次格式化xml,并具有格式化xml的通用代码:

function script:Write-Xml {
  param(
    [Parameter(Mandatory=$true)][xml]$Xml,
    [Parameter(Mandatory=$false)][Switch]$InternalRepeat
  )

  $private:stringbuilder = New-Object System.Text.StringBuilder
  $private:settings = (New-Object System.Xml.XmlWriterSettings)
  $settings.Indent = $true
  $settings.IndentChars = "  "
  $settings.NewLineChars = "`n"

  $xmlWriter = [System.XML.XmlWriter]::Create($stringbuilder, $settings)
  $Xml.WriteContentTo($xmlWriter)
  $xmlWriter.Flush()
  $xmlWriter.Close()

  if (!$InternalRepeat.IsPresent) {
    return (Write-Xml -Xml $stringbuilder.ToString() -InternalRepeat)
  }
  return $stringbuilder.ToString()
}

并像这样使用它,就能完成工作:

Write-Xml -Xml $xmlDoc

我不知道我是怎么想到这个想法的,也不知道它为什么起作用,但是至少在PS 5.1上它确实起作用;)