2017-08-29 85 views
0

在PowerShell中,我試圖根據category屬性檢索2個XML標籤之間的所有字符串值。獲取2個XML標籤之間的所有值

實施例的代碼顯示:

<Report name="test" category="thisone"> 
    <String>test</String> 
    <String>test2</String> 
    <Report name="new test" category="hi"> 
    <String>hello</String> 
    <String>hi again</String> 
    </Report> 
</Report> 

所以我想輸出的那些4個字符串的基礎上,<Report>標籤與類別「thisone」。由於兩個XML標籤都以「Report」開頭,但類別「hi」是「thisone」的子項,所以我也遇到了麻煩,所以我也需要它的字符串。

回答

2

可以通過管道的XML,以便Select-Xml,做反對的XPath搜索這樣的:

$text = Get-Content C:\Path\To\File.xml 
$text | Select-Xml -XPath '//Report[@category="thisone"]//String'|%{$_.Node.'#text'} 

的重要組成部分,是XPath搜索。 //表示從XML根目錄開始的所有內容,然後查找Report節點,該節點的屬性爲category,值爲"thisone"。然後查看String節點之後的所有節點(同樣用//表示)。它將所有這些string節點傳遞給ForEach-Object循環(使用的別名爲%),並且對於其中的每個節點,它都展開Node屬性以及其中的#text屬性。這導致:

test 
test2 
hello 
hi again 

要輸出的字符串到一個文件你可以管的第二行以Set-Content(或Out-File,但該cmdlet是有點過時IMO)。

$text | Select-Xml -XPath '//Report[@category="thisone"]//String'|%{$_.Node.'#text'} | Set-Content C:\Path\To\NewFile.txt 

或者輸出到屏幕和文件,你可以使用Tee-Object如:

$text | Select-Xml -XPath '//Report[@category="thisone"]//String'|%{$_.Node.'#text'} | Tee-Object -FilePath C:\Path\To\NewFile.txt 
+0

它看起來像這樣的工作!我使用了Out-File,而且工作得很好。我沒有意識到的是,它將所有的字符串值(所有類別與'thisone')組合在一起。有沒有一種方法可以將它們作爲變量存儲在數組中以區分彼此?這將允許我Out-File每次出現... – Awsmike

+0

好吧,當然,如果您將輸出重定向到文件,那麼它不會顯示任何內容。那就是那種目的。如果你想輸出到文件以及顯示的東西,你可以使用'Tee-Object' – TheMadTechnician

+0

我編輯我的評論,因爲我有一個錯字。我現在將它輸出到一個文件中,但是我很難將第一個「thisone」與第二個文件分開,因爲它將所有東西都放入一個文件中。我正在考慮將它們作爲變量存儲在數組中將成爲... – Awsmike