使用Powershell v2.0和XPATH读取包含多个属性的xml组件

时间:2016-04-07 12:36:05

标签: xml xpath powershell-v2.0

我无法找到合适的答案,因为所有示例都涉及XML结构的常规或标准形式。我正在尝试搜索xml文件的目录,我想限制那些在xml中指定了特定“OrderDate”属性的目录。因此PS脚本将过滤到特定值,但我无法让PS引用此属性。

<?xml version="1.0"?>
<Order Value="28.78" Lines="3" OrderDate="2016-03-21" SupplierName="ASupplier" OrderNo="1234">
<Line UnitCost="5.28" PackSize="Box 44" Quantity="1" ImpExpRef="1234" LineNo="1"/>
<Line UnitCost="18" PackSize="Box180" Quantity="1" ImpExpRef="1234" LineNo="2"/>
<Line UnitCost="5.5" PackSize="5Ltr" Quantity="1" ImpExpRef="1234" LineNo="3"/>
</Order>

正如你所看到的,有两个节点(或元素?):Order和Line,每个节点有多个属性,没有自己的节点,所以我无法弄清楚如何{{1}这个文件。

仅用于隔离属性的当前脚本是:

XPATH

结果是:

[xml]$XmlDocument = Get-content "C:\example.xml"
$XPath = '//Order[@OrderDate]'    
$nodes = Select-Xml $XmlDocument -XPATH $xpath | Select-Object -ExpandProperty Node

它不会将PS C:\Windows\system32> $nodes OrderNo : 1234 SupplierName : ASupplier OrderDate : 2016-03-21 Lines : 3 Value : 28.78 Line : {Line, Line, Line} 识别为属性或任何其他属性,可能是因为“Order”下有多个属性,就好像它忽略了它。如果@OrderDate

,结果相同

我研究的所有示例都假定每个节点(或元素)有一个属性

1 个答案:

答案 0 :(得分:0)

  

“我尝试了你的建议,但它没有返回任何值,好像它忽略了它”

我可能会错过一些关于你如何尝试或者你想要实现的内容(请澄清)。以下是我做的完全,它返回了预期的元素:

PS C:\Users\Foo> $XmlDocument = [xml]@"
>> <Order Value="28.78" Lines="3" OrderDate="2016-03-21" SupplierName="ASupplier" OrderNo="1234">
>> <Line UnitCost="5.28" PackSize="Box 44" Quantity="1" ImpExpRef="1234" LineNo="1"/>
>> <Line UnitCost="18" PackSize="Box180" Quantity="1" ImpExpRef="1234" LineNo="2"/>
>> <Line UnitCost="5.5" PackSize="5Ltr" Quantity="1" ImpExpRef="1234" LineNo="3"/>
>> </Order>
>> "@
>>
PS C:\Users\Foo> $XPath = "//Order[@OrderDate='2016-03-21']"
PS C:\Users\Foo> $nodes = Select-Xml $XmlDocument -XPATH $xpath | Select-Object -ExpandProperty Node
PS C:\Users\Foo> $nodes


Value        : 28.78
Lines        : 3
OrderDate    : 2016-03-21
SupplierName : ASupplier
OrderNo      : 1234
Line         : {Line, Line, Line}

更新:

在回复下面的评论时,XPath //Order[@OrderDate='2016-03-21']会返回具有特定Order属性值的 OrderDate元素。通过 Order元素我的意思是整个元素都没有留下任何部分。您不能返回仅包含一个属性(即Order属性)的OrderDate元素,因为原始XML中没有此类元素。但是,您可以使用以下XPath返回目标属性:

//Order/@OrderDate[.='2016-03-21']