2012-12-05 36 views
7

Tôi đã điều sau đây:Vòng qua các yếu tố 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 
} 

Tôi cố gắng để tìm ra cách để lặp qua mỗi phần tử trong PowerShell.

Sau đó kiểm tra thuộc tính SID trên phần tử.

Nếu tồn tại nhận giá trị thuộc tính và đặt giá trị đó vào đối tượng và cho cùng một yếu tố lấy thuộc tính thứ hai DISPLAYNAME và đặt vào cùng một đối tượng. Chúng ta sẽ tạo một mảng các đối tượng.

Tôi biết tôi đang đi nhưng hy vọng bạn có thể trợ giúp.

+0

Bạn có thể thêm một số chi tiết khác không? Chẳng hạn như, bạn có biết xml sẽ trông như thế nào không? Powershell cho phép bạn truy cập bằng tên trong trường hợp đó, mà tôi đã tìm thấy làm cho mã dễ đọc hơn nhiều – carlpett

Trả lời

11

Sử dụng XPath thay vì để tìm tất cả các nút với một thuộc tính SID như vậy:

$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 

Dưới đây là một ví dụ với sản lượng:

$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 

Đầu ra:

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

Tôi giả sử bạn muốn thêm một câu lệnh kiểm tra nếu sid là null trước khi tạo nhiều đối tượng rỗng mới, vì vậy bạn nhận được một loạt các objs có liên quan. – Anicho

+0

Vì XPATH xác định rằng thuộc tính SID tồn tại trên phần tử, tôi sẽ không mong đợi một giá trị null cho SID - có lẽ là một chuỗi rỗng. –

+0

bạn là chính xác, tôi chỉ nói là có hiệu quả trên những gì được lưu trữ trong bộ nhớ. có vẻ như họ trích xuất dữ liệu của người dùng dựa trên quảng cáo có thể có 1000 giây nên mỗi đối tượng sẽ chiếm tới x lượng bộ nhớ, ngay cả khi họ lưu trữ 0 thuộc tính, nó chỉ tiết kiệm một chút dung lượng cho sau này? – Anicho

2

Bạn cũng có thể tham chiếu các nút con khi bạn đang lặp qua các nút con:

$j.LocalName (the name of the child element) 
$j.InnerXml (the Xml content of the child node) 
Các vấn đề liên quan