xml - 更改 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 文件并
在第一种情况下(ID:001)剪切值
<Quantity1>
并将其粘贴到。<Quantity2>
在第二种情况下(ID:002),从 中剪切值
<Quantity2>
,将其粘贴到<Quantity1>
并使其<Quantity2>
等于“CALC”。
我试过这段代码:
[XML]$XMLcontents = [XML](Get-Content $PathToTheFile)
foreach ($i in $XMLcontents.SelectNodes('/Root/Package')) {
$_.Quantity2 = $_.Quantity1
}
但我收到以下错误:
在此对象上找不到属性“Quantity2”。
如何正确引用节点内的元素<Package>
?
解决方案
首先要回答为什么会失败是因为你在使用$_时应该在 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')
推荐阅读
- python - Python的流式`TarFile`和`os.pipe()`:存档不完整
- vuejs2 - 数据与多次使用的同一组件共享
- laravel - 从数据库的多个表中收集数据并面临问题以显示刀片中的数据
- hazelcast - 未建立分区组
- mysql - 当我们尝试通过 SQOOP 连接到 mysql 时出现错误
- c# - auth0 saml 请求的无效存储块长度
- arrays - MatLab:如何将具有不同数据类型的 2 个数组附加到表中?
- c# - c#如何向Cassandra表中插入大量数据
- java - 非持久 JMS 消息是否重新传递给非持久订阅者?
- redirect - 登录/重定向后丢失会话