You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PowerShell处理XML时保留&quot原始格式?

如何在PowerShell处理XML时保留原始的"格式

问题场景

原始XML内容:

<M>
    &amp;lt;remove name=&amp;quot;Session&amp;quot; /&amp;gt;
</M>

执行以下PowerShell脚本后:

$filePath = "a.xml"
$s = [xml](Get-Content $filePath)
$s.Save($filePath)

文件内容变为:

<M>
        &amp;lt;remove name=&quot;Session&quot; /&amp;gt;
</M>

需保留原始的&amp;quot;格式且无法修改原XML结构。

原因分析

使用[xml]类型加载XML时,.NET的XmlDocument会自动解析XML实体引用:

  • &amp;会被解析为&,因此&amp;quot;会被解析为&quot;
  • 保存XML时,XmlDocument会自动将双引号"转义为&quot;,最终导致格式变化

解决方案

方法一:占位符替换法

先将需要保留的特殊转义序列替换为临时占位符,处理XML后再替换回原始格式:

$filePath = "a.xml"
# 读取原始内容并替换目标转义为占位符
$rawContent = Get-Content $filePath -Raw
$rawContent = $rawContent -replace '&amp;quot;', '__TEMP_QUOT__'

# 加载为XML对象(可在此处进行其他XML操作)
$xmlDoc = [xml]$rawContent

# 导出XML内容并替换占位符回原始转义
$processedContent = $xmlDoc.OuterXml
$processedContent = $processedContent -replace '__TEMP_QUOT__', '&amp;quot;'

# 写回文件
Set-Content $filePath $processedContent -Encoding UTF8

如果需要同时保留&amp;lt;格式,只需添加对应的占位符替换:

$filePath = "a.xml"
$rawContent = Get-Content $filePath -Raw
# 替换多个需要保留的转义序列
$rawContent = $rawContent -replace '&amp;lt;', '__TEMP_LT__'
$rawContent = $rawContent -replace '&amp;quot;', '__TEMP_QUOT__'

$xmlDoc = [xml]$rawContent
$processedContent = $xmlDoc.OuterXml

$processedContent = $processedContent -replace '__TEMP_LT__', '&amp;lt;'
$processedContent = $processedContent -replace '__TEMP_QUOT__', '&amp;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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:42:37