Powershell按名称查询结构对象

时间:2014-10-14 16:56:48

标签: powershell powershell-v3.0

我有一个从以下XML结构生成的Powershell对象(它来自SOAP Web服务):

<item>
  <id>123</id>
  <newAttrs>
    <item>
      <name>uid</name>
      <values>
        <item>nUser1</item>
      </values>
    </item>
    <item>
      <name>cn</name>
      <values>
        <item>some user name</item>
      </values>
    </item>
  </newAttrs>
</item>

但请注意,这实际上是一个对象而不是xml。所以我可以通过$item.id

访问id

我想知道我是否可以访问newAttrs数组中相似的项目值。所以我想的是$item.newAttrs[name="uid"].Values或者我必须迭代newAttrs数组吗?

有这样的事吗? 非常感谢!

1 个答案:

答案 0 :(得分:0)

我认为.SelectNodes()方法可以实现您的目标:

$item.SelectNodes("//newAttrs[contains(name,""uid"")]").values

或者,如果您只想要该项目的文本,则可以将.InnerText附加到该命令的末尾。

编辑:抱歉,我误会了。我以为它是XML,但你只知道如何引用它就好像它是一个对象。因此,如果我理解正确,你应该有一个像这样的对象:

$item = [pscustomobject]@{
    "id" = '123'
    'newAttr' = [pscustomobject]@{
        'uid' = 'nUser1'
        'cn' = 'some user name'
    }
}

其中$ item有两个属性,&#39; id&#39;和&#39; newAttr&#39;。 &#39; ID&#39;是一个字符串,&#39; newAttr&#39;是一个嵌套的对象,有两个属性,即&#39; uid&#39;和&#39; cn&#39;,两者都是字符串。如果是这种情况,您可以参考&#39; uid&#39;属性只需引用它就像这样:

$item.newAttr.uid

这是否能达到您的目的,还是我仍然误解?

编辑2:好的,因为这是一个对象数组,听起来你已经按照我所知道的最佳方式做了这件事:

$item.newAttr | Where{$_.name -eq 'uid'} | Select -ExpandProperty Value

这将为您提供“价值”的价值。数组中每个项目的属性,其中名称为&#39;财产等于&#39; uid&#39;。