给出以下xml:
<foo bar="&foobar">some text</foo>
我需要获取bar属性的值而不进行转义。到目前为止我在PowerShell中尝试的每种方法都会产生这个值:
&foobar
而不是:
&foobar
我需要后者,因为我需要文字的,正确转义的值来保持。
如果我这样做:
[xml]$xml = "<foo bar='&foobar'>some text</foo>"
$xml.foo.bar
属性值未转义(即&amp; foobar)。
如果我这样做:
$val = $xml | select-xml "/foo/@bar"
$val.Node.Value
属性值未转义(即&amp; foobar)。
确保使用PowerShell获取属性的原始转义值的最佳方法是什么?
答案 0 :(得分:7)
使用上面的示例XML,以下各项将生成bar属性的原始转义值:
使用XPath:
$val = $xml | select-xml "/foo/@bar"
$val.Node.get_innerXml()
使用PowerShell的原生XML语法:
$xml.foo.attributes.item(0).get_innerXml()
答案 1 :(得分:6)
[Security.SecurityElement]::Escape($xml.foo.bar)
答案 2 :(得分:6)
您也可以使用
[System.Web.HttpUtility]::HtmlEncode($xml.foo.bar)
。
使用PowerShell的html编码有一个很好的答案:What is the best way to escape html specific characters in a string in (PowerShell)
我不确定它是否比@ shay的答案更好,因为数据仍然通过XML解析器,它返回未转义的值,然后通过函数传回以再次转义它。
“内容”在任何情况下都被操纵,而不是“原始内容”。它可能是分裂的头发,但在过去,当我需要对最初发送的内容进行不可否认时,我将整个blob存储为文本。
通过访问@bar属性OuterXml属性来获取“文本”是可以接受的。该OuterXml属性将返回:
bar="&foobar"
从那里,我们可以做类似的事情:
$xml.foo.attributes['bar'].OuterXml.Split("=")[1]
返回:
"&foobar"
我认为这是我们想要结束的地方,但你可以用更好的方式做到这一点。 :)