更改XML文件中的元素值

时间:2018-06-22 17:39:15

标签: xml powershell

需要使用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文件,并且

  • <Quantity1>中剪切值,并在第一种情况下将其粘贴到<Quantity2>(ID:001)。

  • <Quantity2>剪切值,将其粘贴到<Quantity1>,在第二种情况下将<Quantity2>等于'CALC'(ID:002)。

    < / li>

我尝试了以下代码:

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

但出现以下错误:

  

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

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

3 个答案:

答案 0 :(得分:1)

首先要回答失败的原因,是因为您在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')

答案 1 :(得分:0)

Powershell中的XML可能很棘手。我会做这样的事情...

[xml]$xmlDoc = @"
<?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>
"@

$xmlDoc.Root.Package

foreach ( $package in $xmlDoc.Root.Package ) {
    if ( $package.ID.Equals('001') ) {
        $package.Quantity2 = $package.Quantity1
    }

    if ( $package.ID.Equals('002') ) {
        $package.Quantity1 = $package.Quantity2
        $package.Quantity2 = 'CALC'
    }
}

$xmlDoc.Root.Package

第一部分[xml]$xmlDoc = @"..."@是我创建的XML文档。我把它塞进了big'ol here-string中。

$xmlDoc.Root.Package只是用来向您显示数据的原始状态。您不需要在最终产品中使用它。

foreach循环是我进行更改的地方。我遍历Package元素中的所有Root元素。对于每个元素,我检查ID元素的值。如果它是“ 001”,则将该包的Quantity2元素值复制到Quantity1。如果是“ 002”,我将Quantity2复制到Quantity1,然后将“ CALC”添加到Quantity2。您可以看到我如何分配值。

希望这会有所帮助!

答案 2 :(得分:0)

# requires -version 6
(Select-Xml -Path C:\path\input.xml -XPath //Package).Node.ForEach{
   $node = $_
   switch ([Int32]$_.ID) {
      1 { $node.Quantity2 = $node.Quantity1 }
      2 {
         $node.Quantity1 = $node.Quantity2
         $node.Quantity2 = 'CALC'
      }
   }
   $node.OwnerDocument.Save('C:\path\input.xml')
}