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

kip*_*ney 5 xml powershell xpath

给出以下xml:

<foo bar="&amp;foobar">some text</foo>
Run Code Online (Sandbox Code Playgroud)

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

&foobar
Run Code Online (Sandbox Code Playgroud)

而不是这个:

&amp;foobar
Run Code Online (Sandbox Code Playgroud)

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

如果我这样做:

[xml]$xml = "<foo bar='&amp;foobar'>some text</foo>"
$xml.foo.bar
Run Code Online (Sandbox Code Playgroud)

属性值未转义(即&foobar).

如果我这样做:

$val = $xml | select-xml "/foo/@bar"
$val.Node.Value
Run Code Online (Sandbox Code Playgroud)

属性值未转义(即&foobar).

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

Sha*_*evy 7

[Security.SecurityElement]::Escape($xml.foo.bar)
Run Code Online (Sandbox Code Playgroud)


kip*_*ney 7

使用上面的示例XML,以下每个将生成bar属性的原始转义值:

使用XPath:

$val = $xml | select-xml "/foo/@bar"
$val.Node.get_innerXml()
Run Code Online (Sandbox Code Playgroud)

使用PowerShell的原生XML语法:

$xml.foo.attributes.item(0).get_innerXml()
Run Code Online (Sandbox Code Playgroud)


Zac*_*ham 6

你也可以使用

[System.Web.HttpUtility]::HtmlEncode($xml.foo.bar).

有关使用PowerShell的html编码的答案很清楚:在(PowerShell)中转义字符串中html特定字符的最佳方法是什么

我不确定它是否比@ shay的答案更好,因为数据仍然通过XML解析器,它返回未转义的值,然后通过函数传回以再次转义它.

"内容"在任何情况下都被操纵,而不是"原始内容".它可能是分裂的头发,但在过去,当我需要对最初发送的内容进行不可否认时,我将整个blob存储为文本.

通过访问@bar属性OuterXml属性来获取"文本"是可以接受的.该OuterXml属性将返回:

bar="&amp;foobar"
Run Code Online (Sandbox Code Playgroud)

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

$xml.foo.attributes['bar'].OuterXml.Split("=")[1]
Run Code Online (Sandbox Code Playgroud)

哪个回报:

"&amp;foobar"
Run Code Online (Sandbox Code Playgroud)

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