2017-07-19 60 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

相關問題