【问题标题】:How to get an escaped xml attribute value in PowerShell without it being unescaped如何在不转义的情况下在 PowerShell 中获取转义的 xml 属性值
【发布时间】:2012-12-21 01:09:49
【问题描述】:

给定以下 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 获得属性的原始转义值的最佳方法是什么?

【问题讨论】:

    标签: xml powershell xpath


    【解决方案1】:
    [Security.SecurityElement]::Escape($xml.foo.bar)
    

    【讨论】:

    • 这可能比使用HtmlEncode更好,但是为什么这不在System.Xml下?
    【解决方案2】:

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

    使用 XPath:

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

    使用 PowerShell 的原生 XML 语法:

    $xml.foo.attributes.item(0).get_innerXml()
    

    【讨论】:

      【解决方案3】:

      你也可以使用

      [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 attributes OuterXml 属性来获取“文本”可能是可以接受的。该 OuterXml 属性将返回:

      bar="&amp;foobar"
      

      从那里,我们可以执行以下操作:

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

      返回:

      "&amp;foobar"
      

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

      【讨论】:

      • 感谢扎克的回答。您一个 Shay 提出的建议都可以得到正确的值,但您也是正确的,因为该值是未转义和重新转义的。我希望有一种直接的方法可以访问未经处理的值。
      • Hmmm....$xml.foo.attributes['bar'].OuterXml 返回未转义的数据以及属性。似乎属性上应该有一个 InnerText 属性:)。现在通过 XmlAttribute 类探索
      • 使用我上面的示例,$val.Node_getInnerXml() 返回正确的转义值,$xml.foo.attributes.item(0).get_innerXml 也是如此。我认为我们有一个赢家。
      • 感谢您的帮助——您让我朝着正确的方向前进。
      • 就是这样!
      猜你喜欢
      • 1970-01-01
      • 2012-03-19
      • 2012-03-06
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 2020-11-20
      • 2013-09-10
      • 1970-01-01
      相关资源
      最近更新 更多