Как напечатать угловые скобки в XML с помощью powershell - PullRequest
1 голос
/ 02 апреля 2019

Я хочу напечатать угловые скобки (<,>) в powershell, но вместо этого он печатает в> и <соответственно.Можно ли как-нибудь напечатать эти символы. </p>

Я использовал \, чтобы преодолеть escape-свойства скобки, а также одинарные кавычки, но результат остался прежним.

$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>

Заранее спасибо !!

Ответы [ 2 ]

2 голосов
/ 03 апреля 2019

XML необходимо заменить 5 символов, потому что они имеют особое значение в XML. Эти символы <>&'" Здесь вы не можете просто добавить эти символы к какому-либо управляющему символу, например к обратной косой черте, вместо этого их необходимо преобразовать в именованные или пронумерованные сущности .

Как вы заметили, это преобразование происходит автоматически в [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 , которая обернет вашу строку внутри <![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 голосов
/ 02 апреля 2019

Так работает XML.Символы меньше и больше являются зарезервированными / специальными символами.Когда значение включает их, оно преобразует их в экранированные формы &lt; и &gt;.То, что вы ожидаете получить, является недопустимым XML.

...