AppendChild到XML的特定位置

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

现在,我想将以下XML文件添加到第一个文件中,并考虑到正确的位置,即名称为“ Bookings”的父文件:

<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'); 

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

在子节点的附加位置是否存在定义的“简便”可能性?

hzthzjln 回答:AppendChild到XML的特定位置

当您使用System.Xml.XmlDocument提供的 PowerShell对XML DOM的方便修改时,.运算符将执行member enumeration,这意味着诸如{{ 1}}将返回该名称的 all 个子元素。

因此,您需要过滤.ViewCategories数组以获取感兴趣的特定元素,您可以使用.Where() array method (PSv4 + ):

.ViewCategories

或者,使用XPath查询通过.SelectSingleNode()定位感兴趣的元素:

$x.ViewsFile.Categories.ViewCategory.Where({ $_.Name -eq 'Bookings' }).Views.AppendChild($x.ImportNode(($y.ViewCategory.Views.View),$true))

注意:我使用了$x.SelectSingleNode('//ViewCategory[@Name = "Bookings"]').Views.AppendChild($x.ImportNode(($y.ViewCategory.Views.View),$true)) 的快捷方式,该快捷方式将//元素定位在文档中的任何位置,但是您可以将整个路径拼写为ViewCategoy,更快并且避免了歧义。

本文链接:https://www.f2er.com/3138078.html

大家都在问