Powershell和使用XML
问题描述:
我正在努力编写一个解析由我们的应用程序生成的XMl的PowerShell脚本。我遇到的问题是我无法对数据进行相应分组,并且我确信这是我做得不好的事情。Powershell和使用XML
这里是一个示例XML:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<CustomerInfo name="Widget_Works" areaid="Enterprise" categoryid="Automotive">
<Customer name="Customer Contact">
<Customer name="Name" value="John Doe"/>
<Customer name="Location" value="Texas"/>
</Customer>
<Customer name="Customer Orders">
<Customer name="OrderItem_0" value="3|7|Car Widgets"/>
<Customer name="OrderItem_1" value="3|7|Engine Widget"/>
<Customer name="OrderItem_2" value="3|7|Chasis Widget"/>
</Customer>
</CustomerInfo>
<CustomerInfo name="Widget_Inc" areaid="Enterprise" categoryid="Automotive">
<Customer name="Customer Contact">
<Customer name="Name" value="Jane Doe"/>
<Customer name="Location" value="New York"/>
</Customer>
<Customer name="Customer Orders">
<Customer name="OrderItem_0" value="1|4|Car Widgets"/>
<Customer name="OrderItem_1" value="3|7|Engine Widget"/>
<Customer name="OrderItem_2" value="1|4|Chasis Widget"/>
<Customer name="OrderItem_3" value="1|4|Windshield Widget"/>
<Customer name="OrderItem_4" value="1|4|Tire Widget"/>
</Customer>
</CustomerInfo>
<CustomerInfo name="Widget_Inc" areaid="Enterprise" categoryid="Train">
<Customer name="Customer Contact">
<Customer name="Name" value="Jane Doe"/>
<Customer name="Location" value="New York"/>
</Customer>
<Customer name="Customer Orders">
<Customer name="OrderItem_0" value="1|4|Train Car Widgets"/>
<Customer name="OrderItem_1" value="3|7|Engine Widget"/>
</Customer>
</CustomerInfo>
</root>
我与挣扎的部分是我想只能说明什么,是汽车与订单旁边的CustomerInfo名称一起的所有订单。
这只会得到名字,但不知道如何通过德的categoryID
$xml.root.customerinfo | select name
name
----
Widget_Works
Widget_Inc
Widget_Inc
然后只得到了输出,并能满足客户名称订单过滤是在哪里我不知道正确的语法,以及当它看到“|”时如何突破额外的列在订单的值字符串中。
$xml.root.customerinfo.customer.customer
name value
---- -----
Name John Doe
Location Texas
OrderItem_0 3|7|Car Widgets
OrderItem_1 3|7|Engine Widget
OrderItem_2 3|7|Chasis Widget
Name Jane Doe
Location New York
OrderItem_0 1|4|Car Widgets
OrderItem_1 3|7|Engine Widget
OrderItem_2 1|4|Chasis Widget
OrderItem_3 1|4|Windshield Widget
OrderItem_4 1|4|Tire Widget
Name Jane Doe
Location New York
OrderItem_0 1|4|Train Car Widgets
OrderItem_1 3|7|Engine Widget
基本上只想要一个像这样的输出:
Order Status Status2 Customer Name
Car Widgets 3 7 Widget Works
Engine Widgets 3 7 Widget Works
Chasis Widgets 3 7 Widget Works
Car Widgets 1 4 Widget Inc
Engine Widgets 3 7 Widget Inc
Chasis Widgets 1 4 Widget Inc
Windshield Widgets 1 4 Widget Inc
Tire Widgets 1 4 Widget Inc
答
使用XPath查询按类别ID过滤掉,然后就可以展开节点来获取信息:
$automotiveCustomers = select-xml '/root/CustomerInfo[@categoryid="Automotive"]' $xml | select -expand node
然后,您可以通过筛选出“自定义命令”(请参阅where命令)并将所需的所有信息放入新的自定义PowerShell对象中来抽取所需的信息:
$automotiveCustomers | foreach{
$customerName = $_.name;
$_.Customer | where{$_.name -eq "Customer Orders"} | select -expand Customer | foreach{
[PSCUstomObject] @{"Customer Name" = $customername; "Order"=$_.value}}}
可以修改上面的命令来使用-split
操作员在自定义对象的不同特性上|
和存储分割的顺序。请注意,您必须逃离|
指定分割符时,因为它的特殊字符:
$automotiveCustomers | foreach{
$customerName = $_.name;
$_.Customer | where{$_.name -eq "Customer Orders"} | select -expand Customer | foreach{
$orderSplit = $_.value -split "\|";
[PSCUstomObject] @{"Customer Name" = $customername; "Status"=$orderSPlit[0]; "Status2"=$orderSplit[1]; "Order"=$orderSplit[2];}}}
但这只能选择与汽车类的人,但是,那并不让我扩大了客户/客户订单。将它们放入嵌套的ForEach语句会更好吗? – texnoob
@texnoob我详细阐述了我的答案。 – zdan