6

给定以下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

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

如果我这样做:

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

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

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

4

3 回答 3

10
[Security.SecurityElement]::Escape($xml.foo.bar)
于 2012-12-20T15:53:18.997 回答
8

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

使用 XPath:

$val = $xml | select-xml "/foo/@bar"
$val.Node.get_innerXml()

使用 PowerShell 的原生 XML 语法:

$xml.foo.attributes.item(0).get_innerXml()
于 2012-12-20T17:09:49.767 回答
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"

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

于 2012-12-20T16:04:13.297 回答