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)

データはまだXMLパーサーを通過しており、エスケープされていない値が返され、関数を介して戻されて再びエスケープされるため、@shayの回答よりも優れているかどうかはわかりません。

いずれにせよ、「コンテンツ」は操作されており、「元のコンテンツ」ではありません。髪を分割している可能性がありますが、以前、最初に送信されたものに対する否認防止が必要だったとき、ブロブ全体をテキストとして保存しました。

@bar 属性の OuterXml プロパティにアクセスして「テキスト」を取得することもできます。その OuterXml プロパティは次を返します。

bar="&amp;foobar"

そこから、次のようなことができます。

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

どちらが返されますか:

"&amp;foobar"

これが私たちが行きたいところだと思いますが、おそらくもう少し良い方法でそれを行うことができます. :)

于 2012-12-20T16:04:13.297 に答える