获得了一个包含大量空白格式的大型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而不是两者。
答案 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上它确实起作用;)