2012-12-05 19 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 के भीतर प्रत्येक तत्व के माध्यम से कैसे पाश यह पता लगाने की कोशिश कर रहा हूँ।

फिर तत्व पर एसआईडी की विशेषता की जांच करें।

यदि मौजूद है तो विशेषता मान प्राप्त करें और उस मान को किसी ऑब्जेक्ट में रखें और उसी तत्व के लिए दूसरी विशेषता DISPLAYNAME को पकड़ें और उसी ऑब्जेक्ट में रखें। हम वस्तुओं की एक सरणी बना देंगे।

मुझे पता है कि मैं रास्ता बंद कर रहा हूं लेकिन आशा करता हूं कि आप मदद कर सकते हैं।

+0

क्या आप कुछ और विवरण जोड़ सकते हैं? जैसे, क्या आप जानते हैं कि एक्सएमएल कैसा दिखता है? पावरहेल आपको उस मामले में नाम से एक्सेस करने की इजाजत देता है, जिसे मैंने पाया है – carlpett

उत्तर

11

उपयोग XPATH बजाय इतना की तरह एक सिड विशेषता के साथ सभी नोड्स को खोजने के लिए:

$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

पढ़ने के लिए कोड को अधिक आसान बनाता है। मुझे लगता है कि आप एक बयान जोड़ना चाहते हैं जो जांचता है कि क्या एकाधिक नई ओब्जे खाली वस्तुओं को बनाने से पहले सिड शून्य है, तो आपको मिलता है ओबीजे की एक सरणी जो प्रासंगिक हैं। – Anicho

+0

चूंकि XPATH निर्दिष्ट करता है कि एसआईडी विशेषता तत्व पर मौजूद है, इसलिए मैं एसआईडी के लिए शून्य मान की अपेक्षा नहीं करता - शायद एक खाली स्ट्रिंग। –

+0

आप सही हैं, मैं सिर्फ स्मृति में संग्रहीत चीज़ों पर कुशल होने के लिए कह रहा हूं। ऐसा लगता है कि वे विज्ञापन आधारित उपयोगकर्ताओं के डेटा निकालने के लिए 1000s हो सकते हैं, इसलिए प्रत्येक ऑब्जेक्ट एक्स की मात्रा को ले लेगा, भले ही वे 0 गुणों को संग्रहीत करते हैं, फिर भी यह बाद में थोड़ी सी जगह बचाता है? – Anicho

2

आप भी कर सकते हैं

$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 

यहाँ उत्पादन के साथ एक उदाहरण है जब आप बच्चे के माध्यम से पुनरावृत्त कर रहे हों तो बच्चे नोड्स का संदर्भ लें:

$j.LocalName (the name of the child element) 
$j.InnerXml (the Xml content of the child node) 
संबंधित मुद्दे