如何使用PowerShell在XML中打印尖括号

问题描述 投票:1回答:2

我想在powershell中打印尖括号(<,>),但它分别打印到>和<。有什么方法可以打印这些符号。

我使用\来克服括号的转义属性以及单引号,但结果保持不变。

$xml = [xml](Get-Content -Path C:\Users\Desktop\new.xml)
$xml.Deploy.app="$<abc\bc>"
$xml.Save("C:\Users\Desktop\new.xml")

我期待输出

<?xml version="1.0"?> 
<Deploy>
  <app><abc\bc></app>
</Deploy>

但它印刷

<?xml version="1.0"?>
<Deploy>
  <app>&lt;abc\bc&gt;</app>
</Deploy>

提前致谢!!

xml powershell powershell-v5.0 powershell-v5.1
2个回答
2
投票

XML需要替换5个字符,因为它们在XML中具有特殊含义。这些字符是<>&'"在这里,你不能简单地在这些字符前加上一些转义字符,如反斜杠,而是需要将它们转换为命名或编号的entities

正如您所注意到的,此转换在[xml]中自动发生,但如果需要,还有许多方法可以手动执行:

$str = "$<abc\bc>"

1)使用String .Replace()方法:

$str.Replace("&", "&amp;").Replace("'", "&apos;").Replace('"', "&quot;").Replace("<", "&lt;").Replace(">", "&gt;")

2)使用.Net System.Security:

 Add-Type -AssemblyName System.Security
 [System.Security.SecurityElement]::Escape($str)

3)使用System.Xml.XmlDocument:

[xml]$doc = New-Object System.Xml.XmlDocument
$node = $doc.CreateElement("root")
$node.InnerText = $str
$node.InnerXml

4)使用正则表达式:

$str -ireplace '&#34;|&#x(?:00)?22;|"', '&quot;' `
     -ireplace "&#39;|&#x(?:00)?27;|'", '&apos;' `
     -ireplace '&#60;|&#x(?:00)?3C;|<', '&lt;'   `
     -ireplace '&#62;|&#x(?:00)?3E;|>', '&gt;'   `
     -ireplace '&#38;|&#x(?:00)?26;|&(?!(?:[a-z]+|#[0-9]+|#x[0-9a-f]+);)', '&amp;'

以上所有内容都会将XML特殊字符转换为实体,因此结果如下所示:

$&lt;abc\bc&gt;


如果你绝对不希望将XML特殊字符转换为实体,那么AFAIK只有将值设置为CDATA section的选项,它将把你的字符串包装在<![CDATA[]]>中。要在您的示例中使用它,请将行$xml.Deploy.app="$<abc\bc>"更改为:

$xml['Deploy']['app'].AppendChild($xml.CreateCDataSection("$<abc\bc>")) | Out-Null

现在它将打印:

<?xml version="1.0"?>
<Deploy>
  <app><![CDATA[$<abc\bc>]]></app>
</Deploy>

要将此CDATA值读回字符串,您可以执行$value = $xml.Deploy.app.InnerText$value = $xml.Deploy.app.'#cdata-section'

希望解释一下


0
投票

这就是XML的工作原理。小于和大于字符是保留/特殊字符。当一个值包含它们时,它会将它们转换为它们的转义形式&lt;&gt;。您希望输出的是无效的XML。

© www.soinside.com 2019 - 2024. All rights reserved.