需要使用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)。
我尝试了以下代码:
[XML]$XMLcontents = [XML](Get-Content $PathToTheFile)
foreach ($i in $XMLcontents.SelectNodes('/Root/Package')) {
$_.Quantity2 = $_.Quantity1
}
但出现以下错误:
在此对象上找不到属性'Quantity2'。
如何正确引用节点<Package>
中的元素?
答案 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')
}