当每个 属性 都有唯一名称时,如何在 PowerShell 中解析 XML?

How can I parse XML in PowerShell when each property has a unique name?

我有一个 xml 文件,如下所示:

<employees>   
    <employee>
        <name>Johnny Rocket</name>
        <age>40</age>
        <somethingelse>Whatever</somethingelse>
        <another>Whatever Again</another>
        ##.... lots more ....##
    </employee>
    <employee>
        ##......
    </employee>

</employees>

我想为您看到的每个 "employee" 创建一个自定义 PowerShell 对象。但是,我不想必须明确说明属性(姓名、年龄、SomethingElse 等等),因为实际上有数十个属性。我想让我的对象的每个 属性 被命名为括号中的内容。

如果括号中的内容是两个词,我也希望解决方案有效。在下面的示例中,我希望对象的成员被命名为 "Food",值为 "Pasta":

<Food Type="Italian">Pasta</Food>)

是否有解决方案可以创建一个自定义对象,其成员名称由括号中的内容定义,并适用于 PowerShell 2?

是的,您可以使用 ChildNodes 属性:

枚举给定 XML 节点的所有子节点
$EmployeesXml = [xml](Get-Content .\employees.xml)

# Locate all <employee> nodes, iterate over them
foreach($EmployeeNode in $EmployeesXml.SelectNodes('//employees/employee')){
    # Create hashtable to hold employee data
    $EmployeeData = @{}
    # Iterate over each child node under <employee>
    $EmployeeNode.ChildNodes |ForEach-Object {
        # Populate employee data based on the node name
        $EmployeeData[$_.Name] = $_.InnerText
    }

    # Create object from collected data
    New-Object psobject -Property $EmployeeData
}