【问题标题】:AppendChild to XML at specific position将子项附加到特定位置的 XML
【发布时间】:2019-11-08 12:06:05
【问题描述】:

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

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

是否有任何“简单”的可能性来定义在哪里附加子节点?

【问题讨论】:

    标签: xml powershell appendchild


    【解决方案1】:

    当你使用System.Xml.XmlDocument提供的PowerShell对XML DOM的便捷适配时,.操作符执行member-access enumeration,也就是说.ViewCategories等访问会返回所有同名的子元素。

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

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

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

    $x.SelectSingleNode('//ViewCategory[@Name = "Bookings"]').Views.AppendChild($x.ImportNode(($y.ViewCategory.Views.View), $true))
    

    注意:我使用了// 的快捷方式,它将ViewCategoy 元素定位在文档中的任何位置,但是您可以将整个路径拼写为/ViewsFile/Categories/ViewCategory[@Name = "Bookings"],这样更快并且避免了歧义。

    【讨论】:

      猜你喜欢
      • 2012-07-14
      • 2011-08-18
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      相关资源
      最近更新 更多