我想读取一个XML文件并修改一个元素,然后将其保存回文件。在保持格式的同时保持行结束符匹配(CRLF vs LF)的最佳方法是什么?
这是我的,但它没有做到这一点:
$xml = [xml]([System.IO.File]::ReadAllText($fileName))
$xml.PreserveWhitespace = $true
# Change some element
$xml.Save($fileName)
问题是额外的新行(在xml中也称为空行)被删除,并且在我混合了LF和CRLF之后。
5条答案
按热度按时间uyhoqukh1#
您可以使用PowerShell [xml]对象并设置
$xml.PreserveWhitespace = $true
,或者使用.NETXmlDocument
执行相同的操作:在调用
XmlDocument.Load
或XmlDocument.LoadXml
之前,请确保设置PreserveWhitespace。注意:这不会保留XML属性之间白色!* XML属性中的空白 * 似乎会保留,但 * 之间的空白 * 不会保留。文档中提到保留“空白节点”(
node.NodeType = System.Xml.XmlNodeType.Whitespace
),而不是属性。1hdlvixo2#
如果您希望更正在XmlDocument上调用保存方法后转换为LF的文本节点的CRLF,则可以使用XmlWriterSettings示例。使用与MilesDavies192s answer相同的XmlWriter,但也将编码更改为utf-8并保持缩进。
jdgnovmf3#
阅读xml时默认忽略空行,为了保留空行,可以在读取文件前修改
PreserveWhitespace
属性:创建XmlDocument对象并配置PreserveWhitespace:
加载文档:
或
1aaf6o9v4#
如果使用XmlWriter进行保存,则默认选项是缩进两个空格,并用CR/LF替换行尾。您可以在创建编写器后配置这些选项,也可以使用根据需要配置的XmlSettings对象创建编写器。
rjzwgtxy5#
我没有看到行尾改变(\r\n),除了最后一个消失。然而,编码从ASCII变成了带有BOM的UTF8。