PowerShell中如何保留XML属性格式避免额外空格
解决PowerShell保存XML时的格式与属性空格问题
我懂你现在的头疼之处——用PowerShell处理XML文件时,原本工整的自闭合标签被改成了带空格的样式,甚至部分属性值末尾还被莫名添了空格,而且PreserveWhitespace完全没起到预期的作用。这其实是.NET的XmlDocument.Save()默认格式化行为搞的鬼,下面给你几个实用的解决办法:
方法一:用XmlWriter自定义输出规则(推荐,支持XML内容修改)
这是最灵活可靠的方案,通过配置XmlWriterSettings来精准控制输出格式,彻底避免自动添加空格和修改标签样式:
$filePath = "C:\BeforeSave.xml" $outputPath = "C:\AfterSave.xml" # 加载XML文档 [xml]$apptypexml = Get-Content $filePath # 配置XmlWriter的输出设置 $xmlSettings = New-Object System.Xml.XmlWriterSettings $xmlSettings.OmitXmlDeclaration = $false # 保留XML声明 $xmlSettings.Indent = $true # 保持原文档的缩进结构 $xmlSettings.NewLineOnAttributes = $false # 禁止属性自动换行,避免额外空格 $xmlSettings.IndentChars = "`n" # 用换行符作为缩进(可按需调整) $xmlSettings.CloseOutput = $true $xmlSettings.ConformanceLevel = [System.Xml.ConformanceLevel]::Document # 创建XmlWriter并保存文档 $xmlWriter = [System.Xml.XmlWriter]::Create($outputPath, $xmlSettings) $apptypexml.Save($xmlWriter) $xmlWriter.Close()
这里的NewLineOnAttributes = $false是关键,它会阻止写入器在自闭合标签的/>前添加空格,同时也能避免属性值被莫名追加空格的问题。如果你的XML不需要缩进,也可以把Indent设为$false。
方法二:直接复制原始文本(适合无需修改XML内容的场景)
如果你只是要复制XML文件而不需要修改任何内容,直接读取原始文本再写入,或者用文件复制命令,能100%保留原格式:
# 读取原始文本并写入新文件 Get-Content "C:\BeforeSave.xml" -Raw | Set-Content "C:\AfterSave.xml" -Encoding UTF8
或者更简单的复制命令:
Copy-Item "C:\BeforeSave.xml" "C:\AfterSave.xml"
这种方式完全绕开XML解析器,自然不会有格式变更的问题,但仅限不需要修改XML内容的场景。
为什么PreserveWhitespace没用?
顺便解释下,PreserveWhitespace属性的作用是保留XML元素内容中的空白字符(比如节点内的换行、空格),但它完全不控制属性的格式化和自闭合标签的样式——这些规则是由XML写入器的格式设置决定的,所以你之前的代码里设置了这个属性也没效果。
内容的提问来源于stack exchange,提问作者raj
相关产品推荐
相关产品推荐

