【问题标题】:How to get values in CDATA in XML file with PowerShell?如何使用 PowerShell 在 XML 文件中获取 CDATA 中的值?
【发布时间】:2017-07-19 09:14:24
【问题描述】:

我有一个令人费解的情况,我正在访问来自 XML 的 CDATA 字符串。

我正在访问 XML API 并在 PowerShell 中收集 CDATA 字符串。它返回如下:

侵略者联盟ID:99006227 aggressorCorpID: 244898283 侵略者ID:1283793762 盔甲值:1.0 船体值:1.0 月亮ID:40043321 盾值:0.5166110755741394 太阳能系统 ID:30000686 类型ID:20060

如您所见,有多行。我想将其收集到变量中,例如$aggressorAllianceID = 99006227

完整的 XML 在这里:

<eveapi version="2">
<currentTime>2017-07-19 09:08:18</currentTime>
<result>
<rowset name="notifications" key="notificationID" columns="notificationID">
<row notificationID="644139237">
<![CDATA[
aggressorAllianceID: 99006227 aggressorCorpID: 244898283 aggressorID: 1283793762 armorValue: 1.0 hullValue: 1.0 moonID: 40043321 shieldValue: 0.5166110755741394 solarSystemID: 30000686 typeID: 20060
]]>
</row>
</rowset>
</result>
<cachedUntil>2027-07-17 09:08:18</cachedUntil>
</eveapi>

我已尝试使用 split 命令解析 CDATA 字符串,但我并没有真正实现?

谁能提供一个示例,说明他们将如何访问和更改此 CDATA 信息?

【问题讨论】:

    标签: xml powershell cdata


    【解决方案1】:

    像这样存储数据的规范方法是hashtable。使用ConvertFrom-StringData cmdlet 将字符串中的键=值对列表转换为哈希表数据结构。由于您的数据有冒号而不是 =,因此您需要先替换它们。

    $cdata = @'
    aggressorAllianceID: 99006227
    aggressorCorpID: 244898283
    aggressorID: 1283793762
    armorValue: 1.0
    hullValue: 1.0
    moonID: 40043321
    shieldValue: 0.5166110755741394
    solarSystemID: 30000686
    typeID: 20060
    '@
    
    $ht = $cdata -replace ':', '=' | ConvertFrom-StringData
    

    然后您可以像这样访问各个值:

    $ht['aggressorID']
    $ht['hullValue']
    ...
    

    【讨论】:

      【解决方案2】:

      由于 Tomalak 的有用 cmets 未删除 - 请在考虑之前阅读 New-Variable

      Ansgar's answer 是存储此数据并以编程方式处理此数据的更好方法。要回答您关于如何获取的字面问题,例如$aggressorAllianceID = 99006227,您可以使用New-Variable

      input.txt

      aggressorAllianceID: 99006227
      aggressorCorpID: 244898283
      aggressorID: 1283793762
      armorValue: 1.0
      hullValue: 1.0
      moonID: 40043321
      shieldValue: 0.5166110755741394
      solarSystemID: 30000686
      typeID: 20060
      

      $myReturnedValues = Get-content .\input.txt
      foreach($line in $myReturnedValues){
          New-Variable -Name ($line.Split(": "))[0] -Value ($line.Split(": "))[2]
      }
      

      【讨论】:

      • 让程序创建具有任意、不可预测名称的变量并不是一个好主意。哈希表方法是要走的路。
      • @Tomalak 在我的代码中,我使用New-Variable 结合Get-Variable 来存储和检索基于唯一ID 的可预测数据。完全承认数据存储是我的一个薄弱环节,未来重构时会尝试使用 Ansgar 的方法。这种关于 OP 数据的方法是否如此糟糕以至于可能会造成伤害/导致进一步的问题?
      • 好吧,任何自修改代码(以及在其运行的同一范围内创建变量的代码就是这样)都容易受到攻击(SQL 注入或跨站点脚本是最突出的例子)或在运行时随机破坏,因为现有变量很容易被覆盖。这将导致意外的程序行为。保持程序逻辑干净并防止注入漏洞。
      • @Tomalak 感谢您的解释。
      猜你喜欢
      • 2010-11-19
      • 1970-01-01
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      • 2020-11-27
      • 2019-07-07
      • 1970-01-01
      相关资源
      最近更新 更多