AppendChild到XML的特定位置

问题描述 投票:1回答:1

我有一个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'); 

但是它只会将新视图附加到最后一个类别。

是否有“容易”的定义,可以在何处附加子节点?

xml powershell appendchild
1个回答
2
投票

当使用由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)) 元素定位在文档中的任何位置,但是您可以将整个路径拼写为//,这更快并且避免了歧义。

© www.soinside.com 2019 - 2024. All rights reserved.