PowerShell将&quot替换为“

qf9go6mv  于 2023-05-17  发布在  Shell
关注(0)|答案(2)|浏览(129)

在下面的片段

<M>
    &lt;remove name=&quot;Session&quot; /&gt;
</M>
$filePath = "a.xml"
$s = [xml](Get-Content $filePath)
$s.Save($filePath)

如何保留“原样”?这就是脚本之后文件的样子

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

我不能修改XML格式,因为它是不同系统的一部分。

f0brbegy

f0brbegy1#

  • PowerShell只是这里的信使,您看到的是[[xml]System.Xml.XmlDocument).NET类的行为。
  • 在 * 大多数 * 情况下[2] -例如在您的示例中-XML * 不 * 要求将"字符转义为&quot;
  • 然而,这两种表示-" as-is与&quot;-是 * 等价的 *,并且可以在XML文本中互换使用**。
  • 因此,只要您处理的是符合标准的XML解析器,*在给定文档中使用两种表示中的哪一种都不重要
  • 虽然[xml]类提供了对保留原始(文本)文档的文本格式的 * 一些 * 控制-特别是保留 * 无关紧要的 * 空白-但您对保留输入文本中的字符实体引用没有 * 控制:
  • 事实上,当你加载(解析)XML文本时,信息已经丢失了,当通过.Save()方法将内存中的文档表示保存回文件或通过.OuterXml属性将其转换为XML字符串时,类只是根据需要转义了那些需要它的字符。
    *简化示例
# -> <foo>3" of snow &amp; more</foo>
([xml] '<foo>3&quot; of snow &amp; more</foo>').OuterXml
    • 在内存中 *,&quot;变成了文字"&amp;变成了文字&(如果您将上面的.OuterXml替换为.foo,以输出<foo>元素的 string content,这将产生逐字的3" of snow & more,您可以看到这一点)。
  • serialization(在本例中为 string,通过.OuterXml)中,文字"保持原样-因为它不需要转义-而文字&-需要转义-成为&amp;字符实体引用。

[1]请注意,.NET附带的另一个XML解析器System.Xml.Linq.XDocument表现出相同的行为。
[2]只有当你需要在一个双引号的属性值中 * 嵌入 * "个字符 * 时,才需要转义;例如
<foo stage-name="Nat &quot;King&quot; Cole" />,以便使stage-name属性包含逐字Nat "King" Cole

fafcakar

fafcakar2#

我这样做了,它为我工作。可能是你让它工作的唯一方法然而,这是一个非常简单的答案。

$xmlString = "<M> &quot; </M>"

#save xml string to $s
$s = [xml]$xmlString

#convert " to &quot"
$s.M = $s.M.Replace('"', '&quot;')

Write-Host $s.M

因为我得到了更多的信息,所以重写了我的答案。如果是这种情况,最好的做法是将&quot;中的&替换为&amp;quot;

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

# Replace &quot; with &amp;quot;
foreach ($node in $xml.SelectNodes("//*[contains(text(), '&quot;')]")) {
    $node.InnerXml = $node.InnerXml -replace '&quot;', '&amp;quot;'
}

$xml.Save($filePath)

给予看有没有用告诉我

相关问题