如何在PowerShell处理XML时保留&quot原始格式?
如何在PowerShell处理XML时保留原始的"格式
问题场景
原始XML内容:
<M> &lt;remove name=&quot;Session&quot; /&gt; </M>
执行以下PowerShell脚本后:
$filePath = "a.xml" $s = [xml](Get-Content $filePath) $s.Save($filePath)
文件内容变为:
<M> &lt;remove name="Session" /&gt; </M>
需保留原始的&quot;格式且无法修改原XML结构。
原因分析
使用[xml]类型加载XML时,.NET的XmlDocument会自动解析XML实体引用:
&会被解析为&,因此&quot;会被解析为"- 保存XML时,
XmlDocument会自动将双引号"转义为",最终导致格式变化
解决方案
方法一:占位符替换法
先将需要保留的特殊转义序列替换为临时占位符,处理XML后再替换回原始格式:
$filePath = "a.xml" # 读取原始内容并替换目标转义为占位符 $rawContent = Get-Content $filePath -Raw $rawContent = $rawContent -replace '&quot;', '__TEMP_QUOT__' # 加载为XML对象(可在此处进行其他XML操作) $xmlDoc = [xml]$rawContent # 导出XML内容并替换占位符回原始转义 $processedContent = $xmlDoc.OuterXml $processedContent = $processedContent -replace '__TEMP_QUOT__', '&quot;' # 写回文件 Set-Content $filePath $processedContent -Encoding UTF8
如果需要同时保留&lt;格式,只需添加对应的占位符替换:
$filePath = "a.xml" $rawContent = Get-Content $filePath -Raw # 替换多个需要保留的转义序列 $rawContent = $rawContent -replace '&lt;', '__TEMP_LT__' $rawContent = $rawContent -replace '&quot;', '__TEMP_QUOT__' $xmlDoc = [xml]$rawContent $processedContent = $xmlDoc.OuterXml $processedContent = $processedContent -replace '__TEMP_LT__', '&lt;' $processedContent = $processedContent -replace '__TEMP_QUOT__', '&quot;' Set-Content $filePath $processedContent -Encoding UTF8
方法二:XmlReader禁止实体解析
通过配置XmlReaderSettings禁止解析实体引用,确保原始转义序列不被修改:
$filePath = "a.xml" # 创建XmlReader配置,禁止解析实体 $readerSettings = New-Object System.Xml.XmlReaderSettings $readerSettings.EntityHandling = [System.Xml.EntityHandling]::Manual $readerSettings.IgnoreWhitespace = $false # 保留原始缩进 # 加载XML $reader = [System.Xml.XmlReader]::Create($filePath, $readerSettings) $xmlDoc = New-Object System.Xml.XmlDocument $xmlDoc.Load($reader) $reader.Close() # 创建XmlWriter配置,保留原始格式 $writerSettings = New-Object System.Xml.XmlWriterSettings $writerSettings.Indent = $true $writerSettings.IndentChars = " " # 匹配原始缩进 $writerSettings.OmitXmlDeclaration = $true # 如果原XML没有声明则启用 # 保存XML $writer = [System.Xml.XmlWriter]::Create($filePath, $writerSettings) $xmlDoc.WriteTo($writer) $writer.Flush() $writer.Close()
这种方法直接通过XML读取配置保留原始实体,无需占位符替换,更适合复杂XML场景。
内容的提问来源于stack exchange,提问作者rjv
相关产品推荐
相关产品推荐

