当每个 属性 都有唯一名称时,如何在 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
}
我有一个 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
属性:
$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
}