我正在尝试更改具有价格的XML文件中的值:
<Document-InventoryReport>
<InventoryReport-Lines>
<Line>
<Line-Item>
<id>1</id>
<UnitNetPrice>13.9200</UnitNetPrice>
</Line-Item>
<Line-Item>
<id>2</id>
<UnitNetPrice>13.9200</UnitNetPrice>
</Line-Item>
</Line>
</InventoryReport-Lines>
</Document-InventoryReport>
我想将<UnitNetPrice>
的值替换为负1.0。
我编写了一些脚本,但是没有使用foreach
保存该值:
$xml = Get-Content -Path C:\Test\file.xml
foreach ($element in $xml.'Document-InventoryReport'.'InventoryReport-Lines'.'Line'.'Line-Item'.'UnitNetPrice') {
$element - 1.0
}
有人有什么主意吗?
答案 0 :(得分:3)
您的代码有几个问题:
您没有解析XML数据,因此您将无法访问这些值。
使用
[xml]$xml = Get-Content 'C:\Test\file.xml'
或
$xml = New-Object Xml
$xml.Load('C:\Test\file.xml')
推荐使用后一种方法,但前一种方法在大多数情况下同样有效。
XML数据结构中的值是字符串,因此在进行减法之前,需要将它们转换为数字类型。
您的代码未将修改后的值分配回XML节点。否则,XML数据将不会更新,因为PowerShell运算符会将结果返回给调用方。他们不会就地更新第一个操作数。
将修改后的值分配回节点时,必须将数字值转换回字符串。由于值的格式设置为4位浮点数,因此您可能需要使用format operator(-f
):
'{0:f4}' -f 1.3
使用点访问($xml.NODE.NODE...
)不允许将修改后的值分配回该节点,因为该方法已经扩展了叶节点的值,因此$element
包含值而不是节点。
推荐的方法是将SelectNodes()
与XPath表达式一起使用:
$xml = New-Object Xml
$xml.Load('C:\Test\file.xml')
$expr = '//UnitNetPrice'
$xml.SelectNodes($expr) | ForEach-Object {
$_.'#text' = '{0:f4}' -f ([double]$_.'#text' - 1.0)
}