【问题标题】:Loop through xml elements循环遍历 xml 元素
【发布时间】:2012-11-23 20:07:34
【问题描述】:

我有以下几点:

$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 属性。

如果存在,则获取属性值并将该值放入对象中,对于同一元素,获取第二个属性 DISPLAYNAME 并放入同一对象中。我们将创建一个对象数组。

我知道我很遥远,但希望你能提供帮助。

【问题讨论】:

  • 您能补充一些细节吗?比如,你知道xml会是什么样子吗? Powershell 允许您在这种情况下按名称访问,我发现这使代码更易于阅读

标签: xml powershell foreach xml-parsing powershell-2.0


【解决方案1】:

使用 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               

【讨论】:

  • 我假设您希望在创建多个新的 obj 空对象之前添加一个检查 sid 是否为 null 的语句,这样您就可以得到一个相关的 obj 数组。
  • 由于 XPATH 指定元素上存在 SID 属性,我不希望 SID 为空值 - 可能是空字符串。
  • 你是对的,我只是说要高效处理内存中存储的内容。看起来他们提取基于广告的用户的数据可能有 1000 个所以每个对象都会占用 x 量的内存,即使他们存储 0 个属性也只是为以后节省了一点空间?
  • @Keith Hill感谢您的帮助,但是上面似乎没有遍历子节点
  • XPATH 表达式“//*”表示搜索每个 XML 元素(节点),无论它在元素层次结构中的哪个位置。
【解决方案2】:

您还可以在遍历 childNodes 时引用子节点:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多