1
$xml = [xml] @'
<?xml version="1.0" encoding="UTF-8"?>
<group>
    <product description="phone" id="1234/5678">
        <item name="apple" version="50" />
        <item name="banana" version="100" />
    </product>
    <product description="notebook" id="6666/7777">
        <item name="orange" version="150" />
    </product>
</group>
'@

$xml.group.product[0].item[0].name有效(返回'apple'),因为第一个product元素有2 item个子元素。

但是,$xml.group.product[1].item[0].name不起作用(返回),因为$null只有一个 item元素。

我怎样才能可靠地访问第一item个子元素而不必知道它是否恰好是唯一的?

4

1 回答 1

1

您的示例 xml 不太有效,因此我将使用稍作修改的版本:

$xml = [xml] @"
<?xml version="1.0" encoding="UTF-8"?>
<group>
  <product description="phone" id="1234/5678">
    <item name="apple" version="50" />
    <item name="banana" version="100" />
  </product>
  <product description="notebook" id="6666/7777">
    <item name="orange" version="150" />
  </product>
</group>
"@

在您的场景中,有一个名为Member Enumeration的 PowerShell 功能,它适用于您的第一个product节点并返回所有子节点的数组item,但对于第二个product节点,它只返回item节点本身:

PS> $xml.group.product[0].item.GetType().FullName
System.Object[]

PS> $xml.group.product[1].item.GetType().FullName
System.Xml.XmlElement

因此,您可以从第一个product节点索引到数组,但不能从第二个节点索引到 XmlElement,这给出了您所看到的行为。

要解决这个问题,您可以做的是将item节点强制转换为一个数组,以便即使只有一个也可以对其进行索引item

PS> @($xml.group.product[0].item).GetType().FullName
System.Object[]

PS> @($xml.group.product[1].item).GetType().FullName
System.Object[]

PS> @($xml.group.product[1].item)[0].name
orange
于 2019-11-24T20:48:13.270 回答