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



我找不到合适的答案,因为所有的例子都与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,每个节点有多个属性,并且没有自己的节点,所以我无法弄清楚如何XPATH这个文件。

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

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

结果是:

PS C:Windowssystem32> $nodes
OrderNo      : 1234
SupplierName : ASupplier
OrderDate    : 2016-03-21
Lines        : 3
Value        : 28.78
Line         : {Line, Line, Line}

它不识别@OrderDate属性或任何其他属性,大概是因为"订单"下有多个属性,就好像它忽略了它一样。如果$XPath = '//Order[@*]',则结果相同

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

"我尝试了您的建议,但它没有返回任何值,就好像它忽略了它一样">

我可能错过了一些关于你如何尝试它或你实际想要实现什么的东西(请澄清(。以下是我所做的,它返回了预期的元素:

PS C:UsersFoo> $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:UsersFoo> $XPath = "//Order[@OrderDate='2016-03-21']"
PS C:UsersFoo> $nodes = Select-Xml $XmlDocument -XPATH $xpath | Select-Object -ExpandProperty Node
PS C:UsersFoo> $nodes

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

更新:

为了响应您在下面的评论,XPath //Order[@OrderDate='2016-03-21']返回具有特定OrderDate属性值Order元素。我所说的Order元素是指整个元素,不留下任何部分。您不能返回仅包含一个属性OrderOrderDate属性的元素,因为原始 XML 中没有此类元素。但是,您可以使用以下 XPath 仅返回目标属性:

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

相关内容

  • 没有找到相关文章