阅读 xml 文件以及如何使用 powershell 修改逻辑操作

Read xml file and how to modify logical operations using powershell

$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 有效 (returns 'apple'),因为第一个 product 元素有 2 item子元素。

然而,$xml.group.product[1].item[0].name起作用(returns$null),因为只有一个 item 元素.

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

您的示例 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 节点和 returns 所有节点的 arrayitem 节点,但对于第二个 product 节点,它只是 returns 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