Foreach循环,用于更改XML值(-1)并保存到同一文件

时间:2019-03-21 09:46:57

标签: xml powershell

我正在尝试更改具有价格的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
} 

有人有什么主意吗?

1 个答案:

答案 0 :(得分:3)

您的代码有几个问题:

  1. 您没有解析XML数据,因此您将无法访问这些值。

    使用

    [xml]$xml = Get-Content 'C:\Test\file.xml'
    

    $xml = New-Object Xml
    $xml.Load('C:\Test\file.xml')
    

    推荐使用后一种方法,但前一种方法在大多数情况下同样有效。

  2. XML数据结构中的值是字符串,因此在进行减法之前,需要将它们转换为数字类型。

  3. 您的代码未将修改后的值分配回XML节点。否则,XML数据将不会更新,因为PowerShell运算符会将结果返回给调用方。他们不会就地更新第一个操作数。

  4. 将修改后的值分配回节点时,必须将数字值转换回字符串。由于值的格式设置为4位浮点数,因此您可能需要使用format operator-f):

    '{0:f4}' -f 1.3
    
  5. 使用点访问($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)
}