避免使用XmlElement SetAttribute转义新行

时间:2014-01-21 20:50:55

标签: .net xml powershell

我使用PowerShell对包含新行的XML属性进行编码。 XML规范没有具体说明属性中的换行符是非法的,而XML的使用者(我无法控制)似乎并不喜欢它们。

我想制作

<Something>
    <Bla Text='
        here is a
        multi-line string
    '></Bla>
</Something>

我正在使用的代码是这样的:

$xml = New-Object xml
$xml.psbase.PreserveWhitespace = $true
$xml.Load($filename)

$bla = $xml.CreateElement('Bla')
$bla.SetAttribute('Text', $multiLineString)
$xml.Something.AppendChild($bla)

它产生如下输出:

<Bla Text="&#xD;&#xA;    here is a&#xD;&#xA;    multi-line string&#xD;&#xA;    " />

我希望保留换行符。我不太关心引用。

2 个答案:

答案 0 :(得分:1)

实际上它在3.3.3 Attribute Normalization(强调我的)

  

对于非标准化属性值中的每个字符,实体引用或字符引用,从第一个开始并继续到最后一个,执行以下操作:
  *对于字符引用,将引用的字符附加到规范化值   *对于实体引用,递归地将此算法的第3步应用于实体的替换文本   * 对于空格字符(#x20,#xD,#xA,#x9),请在标准化值后附加空格字符(#x20)。
  *对于另一个字符,将字符附加到标准化值。

请注意,稍后会讨论如何以与您所看到的相匹配的方式声明属性,特别是如果我正确读取它,则以CDATA声明。

然而,关于XML的一个重要注意事项是,如果你想要一个足够小的改变,你可以随后转换字符串。

例如上面的xml = xml.Replace("&#xD;", "\r").Replace("&#A;", "\n")。假设你没有新线在一个奇怪的地方,这应该工作。

答案 1 :(得分:1)

尝试将多行字符串创建为here-string:

$xml = New-Object xml
$xml.psbase.PreserveWhitespace = $true
$xml.Load($filename)

$multiLineString = @'
here is a
        multi-line string
'@

$bla = $xml.CreateElement('Bla')
$bla.SetAttribute('Text', $multiLineString)
$xml.Something.AppendChild($bla)

有关使用here-strings的更多信息,请参阅get-help about_quoting_rules。