2017-07-19 63 views
2

我有一个令人费解的情况,用我正在访问的XML中的CDATA字符串。如何使用PowerShell在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> 

我已经tryed解析CDATA字符串分割命令,但我没有真正得到awhere?

任何人都可以提供一个他们如何访问和变量这个CDATA信息的例子吗?

回答

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'] 
... 
0

未删除由于托默勒格的有益的意见 - 请考虑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] 
} 
+1

这不是一个好主意,*所有*让一个程序用任意的,不可预知的名字创建变量。散列表的方法是要走的路。 – Tomalak

+0

@Tomalak在我的代码中,我使用'New-Variable'和'Get-Variable'结合来存储和检索基于唯一ID的可预测数据。完全承认数据存储是我的一个薄弱环节,并且会在未来重构时尝试使用Ansgar的方法。这种方法对于OP的数据如此糟糕以至于可能会导致进一步的问题带来危害/引发? – gms0ulman

+1

那么,任何自我修改的代码(以及在其运行的相同范围内创建变量的代码就是这样)是可用于攻击的(SQL注入或跨站点脚本是最突出的示例)或运行时的随机破坏因为现有变量很容易被覆盖。这将导致意外的程序行为。保持程序逻辑清洁并防止注入漏洞。 – Tomalak

相关问题