Windows下PowerShell的xml.save为何在多行注释中生成LF而非CRLF?
在Windows下PowerShell的Xml.Save()保存多行注释时换行符变为LF而非CRLF的原因及解决方案
问题原因
.NET Framework中XmlDocument.Save()方法的默认行为遵循XML规范:XML标准统一使用LF(\n)作为换行符,与操作系统原生换行符无关。即使你在输入的XML字符串中使用了Windows的CRLF(\r\n),XmlDocument在解析并保存时会自动将所有换行符标准化为LF,以此保证XML文件的跨平台兼容性。
测试代码
[xml]$myXml= @" <myTag> <!-- multi line comment each line ends with CR LF in my code, but with LF after .save gets called end of my multi line comment --> </myTag> "@ $myXml.save("C:\temp\my.xml")
解决方案评估
你提到的使用XmlWriterSettings和XmlWriter的方案是有效且符合规范的,同时可以通过using语句简化代码,自动管理资源:
$settings = New-Object System.Xml.XmlWriterSettings $settings.NewLineChars = "`r`n" $settings.Indent = $true using ($writer = [System.Xml.XmlWriter]::Create("C:\temp\my.xml", $settings)) { $myXml.Save($writer) }
这已经是最简单的解决方案了——因为XmlDocument.Save(string path)的无参数重载内部使用默认配置的XmlWriter,没有直接的参数可以修改换行符行为,必须通过自定义XmlWriterSettings来指定换行符类型。using语句替代手动Close(),既简化了代码又能确保资源被正确释放。
内容的提问来源于stack exchange,提问作者tomwaitforitmy
相关产品推荐
相关产品推荐

