如何在PowerShell中将xml值设置为转义字符

时间:2017-03-15 16:57:39

标签: xml powershell escaping

我需要将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代替&amp;,使用单引号和反斜杠,我似乎无法阻止代码转换&amp; &amp; amp和吐出以下xml

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

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

1 个答案:

答案 0 :(得分:1)

指定普通的多行字符串:

$xml.Variable = "Foo`nBar"

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

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

.NET framework 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