我有一个XML文件,如下所示:
<ViewsFile>
<Categories>
<ViewCategory Name="General">
<Views>
<View Name="firstView">
...
</View>
<View Name="secondView">
...
</View>
</Views>
</ViewCategory>
<ViewCategory Name="Bookings">
<Views>
<View Name="firstView">
...
</View>
<View Name="secondView">
...
</View>
</Views>
</ViewCategory>
<ViewCategory Name="Activities">
<Views>
<View Name="firstView">
...
</View>
</Views>
</ViewCategory>
</Categories>
</ViewsFile>
现在,考虑到正确的位置,即名称为'Bookings'的父文件,我要将以下XML文件附加到第一个文件中:
<ViewCategory Name="Bookings">
<Views>
<View Name="newView">
...
</View>
</Views>
</ViewCategory>
因此最终的XML文件应如下所示:
<ViewsFile>
<Categories>
<ViewCategory Name="General">
<Views>
<View Name="firstView">
...
</View>
<View Name="secondView">
...
</View>
</Views>
</ViewCategory>
<ViewCategory Name="Bookings">
<Views>
<View Name="firstView">
...
</View>
<View Name="secondView">
...
</View>
<View Name="newView">
...
</View>
</Views>
</ViewCategory>
<ViewCategory Name="Activities">
<Views>
<View Name="firstView">
...
</View>
</Views>
</ViewCategory>
</Categories>
</ViewsFile>
此刻我的PowerShell脚本如下:
[xml] $x = Get-Content C:\Users\user\Desktop\exitingViews.xml;
[xml] $y = Get-Content C:\Users\user\Desktop\newView.xml;
$x.ViewsFile.Categories.ViewCategory.Views.AppendChild($x.ImportNode(($y.ViewCategory.Views.View), $true));
$x.Save('C:\Users\user\Desktop\final.xml');
但是它只会将新视图附加到最后一个类别。
是否有“容易”的定义,可以在何处附加子节点?
当使用由System.Xml.XmlDocument
提供的PowerShell对XML DOM的便捷修改时,.
运算符执行member enumeration,这意味着诸如.ViewCategories
的访问将返回all子元素用那个名字。
因此,您需要过滤.ViewCategories
数组以获取感兴趣的特定元素,您可以使用.Where()
array method(PSv4 +):
.Where()
或者,使用XPath查询通过$x.ViewsFile.Categories.ViewCategory.Where({ $_.Name -eq 'Bookings' }).Views.AppendChild($x.ImportNode(($y.ViewCategory.Views.View), $true))
定位感兴趣的元素:
.SelectSingleNode()
注:我使用了.SelectSingleNode()
的快捷方式,该快捷方式将$x.SelectSingleNode('//ViewCategory[@Name = "Bookings"]').Views.AppendChild($x.ImportNode(($y.ViewCategory.Views.View), $true))
元素定位在文档中的任何位置,但是您可以将整个路径拼写为//
,这更快并且避免了歧义。