我使用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="
 here is a
 multi-line string
 " />
我希望保留换行符。我不太关心引用。
答案 0 :(得分:1)
实际上它在3.3.3 Attribute Normalization(强调我的)
对于非标准化属性值中的每个字符,实体引用或字符引用,从第一个开始并继续到最后一个,执行以下操作:
*对于字符引用,将引用的字符附加到规范化值 *对于实体引用,递归地将此算法的第3步应用于实体的替换文本 * 对于空格字符(#x20,#xD,#xA,#x9),请在标准化值后附加空格字符(#x20)。
*对于另一个字符,将字符附加到标准化值。
请注意,稍后会讨论如何以与您所看到的相匹配的方式声明属性,特别是如果我正确读取它,则以CDATA声明。
然而,关于XML的一个重要注意事项是,如果你想要一个足够小的改变,你可以随后转换字符串。
例如上面的xml = xml.Replace("
", "\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。