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];}}} 
+0

但这只能选择与汽车类的人,但是,那并不让我扩大了客户/客户订单。将它们放入嵌套的ForEach语句会更好吗? – texnoob

+0

@texnoob我详细阐述了我的答案。 – zdan