Powershell保存XML并保留格式

Mat*_*orn 24 powershell

我想读取XML文件并修改元素,然后将其保存回文件.在保留格式的同时保持匹配行终止符(CRLF与LF)的最佳方法是什么?

这是我所拥有的,但它没有这样做:

$xml = [xml]([System.IO.File]::ReadAllText($fileName))
$xml.PreserveWhitespace = $true
# Change some element
$xml.Save($fileName)
Run Code Online (Sandbox Code Playgroud)

问题是在我混合了LF和CRLF之后,删除了额外的新行(在xml中也称为空行).

感谢帮助一个powershell新手:)

Rya*_*yan 40

您可以使用PowerShell [xml]对象并设置$xml.PreserveWhitespace = $true,或使用.NET XmlDocument执行相同的操作:

$f = '.\xml_test.xml'

# Using .NET XmlDocument
$xml = New-Object System.Xml.XmlDocument
$xml.PreserveWhitespace = $true

# Or using PS [xml] (older PowerShell versions may need to use psbase)
$xml = New-Object xml
#$xml.psbase.PreserveWhitespace = $true  # Older PS versions
$xml.PreserveWhitespace = $true

# Load with preserve setting
$xml.Load($f)
$n = $xml.SelectSingleNode('//file')
$n.InnerText = 'b'
$xml.Save($f)
Run Code Online (Sandbox Code Playgroud)

只需确保在调用XmlDocument.Load或XmlDocument.LoadXml之前设置PreserveWhitespace.

注意:这不会保留XML属性之间的空白!白色空间 XML属性似乎被保留,但不是之间.该文档讨论了保留"空白节点 "(node.NodeType = System.Xml.XmlNodeType.Whitespace)而不是属性.

  • 什么是原生powershell类型?一切都是.NET :) (3认同)
  • @manojlds你是对的,虽然PS封装了一些.NET类型,就像在这种情况下(psbase)所以它"感觉"有点不同,即使它仍然是.NET.:) (2认同)
  • 非常好——尽管我不必使用“psbase”。 (2认同)
  • 这不会保留属性之间的换行符。 (2认同)

Dan*_*Dan 9

如果您想在调用 XmlDocument 上的 Save 方法后更正为文本节点转换为 LF 的 CRLF,您可以使用 XmlWriterSettings 实例。使用与MilesDavies192s 答案相同的 XmlWriter,但还将编码更改为 utf-8 并保持缩进。

$xml = [xml]([System.IO.File]::ReadAllText($fileName))
$xml.PreserveWhitespace = $true

# Change some element

#Settings object will instruct how the xml elements are written to the file
$settings = New-Object System.Xml.XmlWriterSettings
$settings.Indent = $true
#NewLineChars will affect all newlines
$settings.NewLineChars ="`r`n"
#Set an optional encoding, UTF-8 is the most used (without BOM)
$settings.Encoding = New-Object System.Text.UTF8Encoding( $false )

$w = [System.Xml.XmlWriter]::Create($fileName, $settings)
try{
    $xml.Save( $w )
} finally{
    $w.Dispose()
}
Run Code Online (Sandbox Code Playgroud)


ari*_*had 7

读取 xml 时,默认情况下会忽略空行,为了保留它们,您可以在读取文件之前PreserveWhitespace更改属性:

创建 XmlDocument 对象并配置 PreserveWhitespace:

$xmlDoc = [xml]::new()
$xmlDoc.PreserveWhitespace = $true
Run Code Online (Sandbox Code Playgroud)

加载文档:

$xmlDoc.Load($myFilePath)
Run Code Online (Sandbox Code Playgroud)

或者

$xmlDoc.LoadXml($(Get-Content $myFilePath -Raw))
Run Code Online (Sandbox Code Playgroud)