2012-12-05 265 views
7

我有以下幾點:遍歷XML元素

$aMyArray = $null 


[xml]$userfile = Get-Content C:\AppSense\Scripts\AmPolicyConversion\AM_dev.xml 

$i = 0 
FOREACH ($j in $userfile.ChildNodes){ 

    FOREACH($k in $j.DocumentElement) { 

    } 

    $i = $i + 1 
} 

我試圖通過PowerShell中的每個元素弄清楚如何循環。

然後檢查元素上SID的屬性。

如果exists存在,則獲取屬性值並將該值放入一個對象中,併爲同一元素獲取第二個屬性DISPLAYNAME並放入同一個對象中。我們將創建一個對象數組。

我知道我走了,但希望你能幫上忙。

+0

您可以添加更多的細節?比如,你知道xml的樣子嗎? Powershell允許你在這種情況下通過名稱訪問,我發現它讓代碼更容易閱讀 – carlpett

回答

11

使用XPath,而不是找到一個SID屬性的所有節點,如下所示:

$objs = @() 
$nodes = $userfile.SelectNodes("//*[@SID]") 
foreach ($node in $nodes) { 
    $sid = $node.attributes['SID'].value 
    $dispName = $node.attributes['DISPLAYNAME'].value 
    $obj = new-object psobject -prop @{SID=$sid;DISPNAME=$dispName} 
    $objs += $obj 
} 
$objs 

下面是與輸出的例子:

$xml = [xml]@" 
<doc> 
    <foo SID='foosid' DISPLAYNAME="foodisp"> 
    <bar SID='barsid' DISPLAYNAME="bardisp"/> 
    <baz> 
     <blech SID='blechsid' DISPLAYNAME="blechdisp"/> 
    </baz> 
    </foo> 
</doc> 
"@ 

$objs = @() 
$nodes = $xml.SelectNodes("//*[@SID]") 
foreach ($node in $nodes) { 
    $sid = $node.attributes['SID'].value 
    $dispName = $node.attributes['DISPLAYNAME'].value 
    $obj = new-object psobject -prop @{SID=$sid;DISPNAME=$dispName} 
    $objs += $obj 
} 
$objs 

輸出:

SID      DISPNAME     
---      --------     
foosid     foodisp     
barsid     bardisp     
blechsid     blechdisp    
+0

我假設你想添加一個語句,在創建多個新的obj空對象之前檢查sid是否爲空,所以你得到一組相關的objs。 – Anicho

+0

由於XPATH指定元素上存在S​​ID屬性,因此我不希望SID有空值 - 可能是空字符串。 –

+0

你是對的,我只是說要高效地存儲內存中的內容。看起來像他們提取基於廣告的用戶的數據可能有1000個,所以每個對象將佔用x的內存量,即使它們存儲0個屬性它只是爲以後節省一點空間? – Anicho

2

你也可以在遍歷childNodes時引用子節點:

$j.LocalName (the name of the child element) 
$j.InnerXml (the Xml content of the child node)