如何使用PowerShell在XML文件中获取CDATA中的值?

时间:2017-07-19 09:14:24

标签: xml powershell cdata

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

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

aggressorAllianceID: 99006227
aggressorCorpID: 244898283
aggressorID: 1283793762
armorValue: 1.0
hullValue: 1.0
moonID: 40043321
shieldValue: 0.5166110755741394
solarSystemID: 30000686
typeID: 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信息吗?

2 个答案:

答案 0 :(得分:4)

存储数据的规范方式是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']
...

答案 1 :(得分:0)

由于Tomalak的有用评论而取消删除 - 请在考虑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]
}