我无法找到合适的答案,因为所有示例都涉及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
我研究的所有示例都假定每个节点(或元素)有一个属性
答案 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']