[英]PowerShell: Locate parent node and edit children
我有一个给定的 XML 文件,其中包含 0 到 n 个节点,称为 <Launch.Addon>。 我想使用包含值“VRS_TacPack”的子节点“Name”来定位“<Launch.Addon>”节点。 如果发现我需要编辑子节点“禁用”和“手动加载”,然后将更改后的 XML 文件写回。
给定 XML 文件的结构:
<?xml version="1.0" encoding="Windows-1252"?>
<SimBase.Document Type="Launch" version="1,0">
...
<Launch.Addon>
<Name>BlaBlaBla</Name>
...
</Launch.Addon>
<Launch.Addon>
<Name>VRS_TacPack</Name>
<Disabled>True</Disabled>
<ManualLoad>False</ManualLoad>
<Path>Modules\VRS_TacPack\VRS_TacPack.dll</Path>
</Launch.Addon>
<Launch.Addon>
<Name>BluBluBlu</Name>
...
</Launch.Addon>
...
</SimBase.Document>
读取和写入 XML 文件没有问题,但由于我不知道如何在 XML 结构中导航,所以我使用示例来解决这个问题的所有尝试都失败了。
我目前的脚本状态
# Set up new XML object and read DLL.XML file content
$xmlDll = New-Object System.XML.XMLDocument
$xmlDll.Load($tacPackFileSpec)
# Get the <Launch.Addon> node with child node <Name> contains 'VRS_TacPack'
???
# Output modified DLL.XML file
$xmlDll.Save($tacPackFileSpec)
非常感谢任何帮助或提示 Hannes
这里有两个选项供您选择:
[xml]$xml = @"
<?xml version="1.0" encoding="Windows-1252"?>
<SimBase.Document Type="Launch" version="1,0">
<Launch.Addon>
<Name>BlaBlaBla</Name>
</Launch.Addon>
<Launch.Addon>
<Name>VRS_TacPack</Name>
<Disabled>True</Disabled>
<ManualLoad>False</ManualLoad>
<Path>Modules\VRS_TacPack\VRS_TacPack.dll</Path>
</Launch.Addon>
<Launch.Addon>
<Name>BluBluBlu</Name>
</Launch.Addon>
</SimBase.Document>
"@
使用 XPATH(区分大小写)
$xml.SelectNodes("//Launch.Addon/Name[contains(text(), 'VRS_TacPack')]") | ForEach-Object {
$_.ParentNode.Disabled = 'False'
$_.ParentNode.ManualLoad = 'True'
}
$xml.Save("D:\Test\blah.xml")
使用“虚线”属性(不区分大小写)
# need to quote the element names because of the '.'
$xml.'SimBase.Document'.'Launch.Addon' | Where-Object { $_.Name -eq 'VRS_TacPack' } | ForEach-Object {
$_.Disabled = 'False'
$_.ManualLoad = 'True'
}
$xml.Save("D:\Test\blah.xml")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.