2017-03-15 41 views
1

我需要一个XML值设置为换行符换码如何将XML值设置为转义字符在PowerShell中

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

我使用的是获取内容,以创建一个XML对象,并试图分配变量使用下面的方法

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

$xml.Variable = $qux 

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

我使用代替& &放试过,用单引号和反斜线,我似乎无法防止代码转换&到&放大器并吐出以下xml

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

什么是避开PowerShell转换转义字符的最佳方式是什么?

+0

净XML类[保存\ n的实际的新行内的文本节点(https://msdn.microsoft.com/en-us/library/system.xml.xmlwritersettings.newlinehandling(v = vs.110)的.aspx)。为什么你需要它作为一个实体? – wOxxOm

回答

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

+0

当我尝试执行此操作并通过.innerXml设置变量不能工作时,我收到了“无法找到类型XML.XMLWriterSettings”。我很不幸地使用了 –

+0

我正在使用PowerShell 5.1和新的NET框架。那么,你总是可以简单地读取xml文件作为文本,并替换新行'(get-content 2.xml) - 加入' '| out-file ......' – wOxxOm

+0

解决了它。谢谢! –

相关问题