2012-10-24 128 views
2

屬性Powershell的選擇XML節點說我有結構如:其中包含在陣列

[xml]$i = " 
<root> 
    <item> 
     <id>1</id> 
     <data>Content_Of_1</data> 
    </item> 
    <item> 
     <id>2</id> 
     <data>Content_Of_2</data> 
<item> 
    <id>5</id> 
    <data>Content_Of_5</data> 
</item> 
    </item> 
</root> 
" 

$foo = @(1,2,3) 

我想選擇$ i.root.item.data其中$ i.root.item.id是$ FOO。

選擇陣列中具有匹配ID的節點我可以這樣做:

($i.root.item | ? {$foo -contains $_.id}) 

但由於某些原因,如果我試圖讓在$ _數據,我什麼也沒得到。

($i.root.item | ? {$foo -contains $_.id}).data 

爲什麼? 。

+0

你確定xpath標籤嗎? – choroba

+0

原始措詞邀請了替代xpath解決方案。因爲我沒有xpath,所以xpath解決方案仍然很受歡迎。 – Yevgeniy

+0

首先用「商品」替換商品標籤,據我所知存在與「商品」已被用作對象屬性這一事實相關聯的問題。 – JPBlanc

回答

1

但由於某些原因,如果我試圖讓在$ _數據,我得到什麼:

($i.root.item | ? {$foo -contains $_.id}).data 

你什麼也得不到的原因是您試圖訪問屬性(數據)整體上集合它不存在。你需要做到以下幾點:

$i.root.item | ? {$foo -contains $_.id} | ForEach-Object { $_.data } 

它訪問的每個對象數據屬性。 你也可以選擇爲每個對象的數據屬性的值:

$i.root.item | ? {$foo -contains $_.id} | Select-Object data 

將產生PSCustomObjects的數組,其中每個對象將包含一個單一的屬性命名的數據(而不是一個字符串數組作爲ForEach-對象的例子會)。

請注意,在Powershell 3.0中,使用新的屬性枚舉功能,您的原始語法會產生所需的結果,因爲枚舉會自動完成。

+0

謝謝!有沒有辦法做到這一點沒有foreach循環? – Yevgeniy

+0

@Yevgeniy - 使用選擇對象選項更新答案。 – dugas