如何在PowerShell中获取转义的xml属性值而不进行转义

时间:2012-12-20 15:08:50

标签: xml powershell xpath

给出以下xml:

<foo bar="&amp;foobar">some text</foo>

我需要获取bar属性的值而不进行转义。到目前为止我在PowerShell中尝试的每种方法都会产生这个值:

&foobar

而不是:

&amp;foobar

我需要后者,因为我需要文字的,正确转义的值来保持。

如果我这样做:

[xml]$xml = "<foo bar='&amp;foobar'>some text</foo>"
$xml.foo.bar

属性值未转义(即&amp; foobar)。

如果我这样做:

$val = $xml | select-xml "/foo/@bar"
$val.Node.Value

属性值未转义(即&amp; foobar)。

确保使用PowerShell获取属性的原始转义值的最佳方法是什么?

3 个答案:

答案 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="&amp;foobar"

从那里,我们可以做类似的事情:

$xml.foo.attributes['bar'].OuterXml.Split("=")[1]

返回:

"&amp;foobar"

我认为这是我们想要结束的地方,但你可以用更好的方式做到这一点。 :)