kip*_*ney 5 xml powershell xpath
给出以下xml:
<foo bar="&foobar">some text</foo>
Run Code Online (Sandbox Code Playgroud)
我需要获取bar属性的值而不将其转义为未转义.到目前为止我在PowerShell中尝试的每个方法都会产生这个值:
&foobar
Run Code Online (Sandbox Code Playgroud)
而不是这个:
&foobar
Run Code Online (Sandbox Code Playgroud)
我需要后者,因为我需要文字的,正确转义的值来保持.
如果我这样做:
[xml]$xml = "<foo bar='&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获取属性的原始转义值的最佳方法是什么?
使用上面的示例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)
你也可以使用
[System.Web.HttpUtility]::HtmlEncode($xml.foo.bar).
有关使用PowerShell的html编码的答案很清楚:在(PowerShell)中转义字符串中html特定字符的最佳方法是什么
我不确定它是否比@ shay的答案更好,因为数据仍然通过XML解析器,它返回未转义的值,然后通过函数传回以再次转义它.
"内容"在任何情况下都被操纵,而不是"原始内容".它可能是分裂的头发,但在过去,当我需要对最初发送的内容进行不可否认时,我将整个blob存储为文本.
通过访问@bar属性OuterXml属性来获取"文本"是可以接受的.该OuterXml属性将返回:
bar="&foobar"
Run Code Online (Sandbox Code Playgroud)
从那里,我们可以做类似的事情:
$xml.foo.attributes['bar'].OuterXml.Split("=")[1]
Run Code Online (Sandbox Code Playgroud)
哪个回报:
"&foobar"
Run Code Online (Sandbox Code Playgroud)
我认为这是我们想要结束的地方,但你可以用更好的方式做到这一点.:)