【问题标题】:How to set xml value to an escape character in powershell如何在powershell中将xml值设置为转义字符
【发布时间】:2017-03-15 16:57:39
【问题描述】:

我需要为换行符转义码设置一个 xml 值

<Variable>Foo &#xA; Bar</Variable>

我正在使用 get-content 创建一个 xml 对象并尝试使用以下方法分配变量

$qux = $("Foo &#xA; Bar")
$xml = [xml](Get-Content $xmlpath)

$xml.Variable = $qux 

$xml.Save($tlpath)
$xml.Close 

我尝试使用 &amp 代替 &,使用单引号和反斜杠,但我似乎无法阻止代码将 & 转换为 &amp 并吐出以下 xml

<Variable>Foo &amp;#xA; Bar</Variable>

绕过 powershell 转换转义字符的最佳方法是什么?

【问题讨论】:

标签: xml powershell escaping


【解决方案1】:

分配一个普通的多行字符串:

$xml.Variable = "Foo`nBar"

或者将变量作为一个 XML 节点访问并分配一个 XML 字符串,该字符串将被转换为正常的换行符:

$xml['Variable'].innerXml = "Foo&#xA;Bar"

.NET 框架 XML 类将换行符保存为实际的换行符inside text nodes,并在属性内保存为实体。这意味着我们需要在编写 XML 输出之前对其进行后处理:

$xml = [xml]::new()
$xml.Load('r:\1.xml')

$xml.Variable = "Foo`nBar"

# encode &#xD; inside text nodes and both &#xA; &#xD; inside attributes
$xmlSettings = [Xml.XmlWriterSettings]::new()
$xmlSettings.NewLineHandling = [Xml.NewLineHandling]::Entitize 
$sb = [Text.StringBuilder]::new()
$xmlWriter = [System.Xml.XmlWriter]::Create($sb, $xmlSettings)
$xml.Save($xmlWriter)

$sb.ToString().Replace("`n", '&#xA;') | Out-File r:\2.xml -Encoding utf8

注意:在 PowerShell 2.0 中,而不是 [some.class]::new() 使用 New-Object some.class

【讨论】:

  • 当我尝试执行此操作时收到“找不到类型 XML.XMLWriterSettings”,不幸的是通过 .innerXml 设置变量不起作用
  • 我正在使用 PowerShell 5.1 和新的 NET 框架。好吧,您总是可以简单地将 xml 文件作为文本读取并替换新行 (get-content 2.xml) -join '&amp;#xA;' | out-file ......
猜你喜欢
  • 2020-06-02
  • 2013-03-02
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 2014-04-28
  • 2020-01-17
  • 1970-01-01
相关资源
最近更新 更多