首页 > 解决方案 > 更改 XML 文件中的元素值

问题描述

在使用 PowerShell 更改以下 XML 中的元素值时需要帮助:

<?xml version="1.0" encoding="ISO-8859-1"?>
<Root>
<Package>
<ID>001</ID>
<Quantity1>65465</Quantity1>
<Quantity2>CALC</Quantity2>
</Package>
<Package>
<ID>002</ID>
<Quantity1></Quantity1>
<Quantity2>1547625</Quantity2>
</Package>
</Root>

我需要遍历 XML 文件并

我试过这段代码:

[XML]$XMLcontents = [XML](Get-Content $PathToTheFile)
foreach ($i in $XMLcontents.SelectNodes('/Root/Package')) {
   $_.Quantity2 = $_.Quantity1
}

但我收到以下错误:

在此对象上找不到属性“Quantity2”。

如何正确引用节点内的元素<Package>

标签: xmlpowershell

解决方案


首先要回答为什么会失败是因为你在使用$_时应该在 foreach中使用$i 。

好的,首先让我们通过声明将对象转换为 XML

[xml]$XML = @"
<?xml version="1.0" encoding="ISO-8859-1"?>
<Root>
<Package>
<ID>001</ID>
<Quantity1>65465</Quantity1>
<Quantity2>CALC</Quantity2>
</Package>
<Package>
<ID>002</ID>
<Quantity1></Quantity1>
<Quantity2>1547625</Quantity2>
</Package>
</Root>
"@

然后我们将搜索每个包的根目录

foreach($package in $XML.Root.Package){
}

收集值并切换它们

$Q1 = $package.Quantity1
$package.Quantity1 = $package.Quantity2
$package.Quantity2 = $Q1

完整脚本

[xml]$XML = @"
<?xml version="1.0" encoding="ISO-8859-1"?>
<Root>
<Package>
<ID>001</ID>
<Quantity1>65465</Quantity1>
<Quantity2>CALC</Quantity2>
</Package>
<Package>
<ID>002</ID>
<Quantity1></Quantity1>
<Quantity2>1547625</Quantity2>
</Package>
</Root>
"@

foreach($package in $XML.Root.Package){
    $Q1 = $package.Quantity1
    $package.Quantity1 = $package.Quantity2
    $package.Quantity2 = $Q1
}

$XML.Root.Package

如果你想使用 SelectNodes 那么你也可以这样做

foreach ($i in $XML.SelectNodes('/Root/Package')) {
    $Q1 = $i.Quantity1
    $i.Quantity1 = $i.Quantity2
    $i.Quantity2 = $Q1
}

$XML.SelectNodes('/Root/Package')

推荐阅读