【问题标题】:Add XML after specific node在特定节点后添加 XML
【发布时间】:2017-09-22 09:38:46
【问题描述】:

我已经将以下 XML 文档作为 XElement ($el) 加载:

<a>
    <b></b>
    <c></c>
    <d></d>
    <e></e>
</a>

如何使用 PowerShell 在&lt;c&gt;&lt;/c&gt; 下附加另一个 XElement ($theElement)?我尝试了以下方法:

$where = {
    param ($item)
    return ($item.Name.LocalName -eq "c")
}

$el.Descendants().Where($where).FirstOrDefault().Add($theElement)

但是这个错误:

方法调用失败,因为 [System.Collections.ObjectModel.Collection`1[[System.Management.Automation.PSObject,System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]]不包含名为“FirstOrDefault”的方法。

注意:$el$theElement 必须是 System.Xml.Linq.XElement 对象。

【问题讨论】:

    标签: xml linq powershell


    【解决方案1】:

    您的问题是 PowerShell 陷入了 .Net 1.1 的黑暗时代。

    • 没有扩展方法。 Linq 中没有什么是简单的方法,您必须将它们称为静态方法。
    • XmlDocument 是一流的,(XDocument 不是——何必呢,因为扩展方法不起作用)

    FirstOrDefault 是一种扩展方法,因此它在 PowerShell 中根本不存在,您必须调用 [System.Linq.Enumerable]::FirstOrDefault(... 并且 Where 方法不是来自 Linq 的方法,它是 PowerShell 特定的附加方法,所以你需要用它来做First的事情。

    TL;DR

    你需要这样写([0] 是因为当你告诉Where 只返回一项时,它返回一个包含一项的数组):

    $el.Descendants.Where({ $_.Name.LocalName -eq "c" }, 1)[0].Add($theElement)
    

    正常的 PowerShell 方式是使用 XmlDocument 和 XPath:

    给定 $xml$node 以及 XPath 选择器:

    [xml]$xml = "
    <a>
        <b></b>
        <c></c>
        <d></d>
        <e></e>
    </a>
    "
    
    $node = "<k/>"
    
    $selector = "//c"
    

    您可以使用 PowerShellGallery 中的 Xml 模块:

    # Insert <k> after <c> in the $xml XmlDocument
    $xml | Update-Xml -After //c $node
    

    或者你可以手写:

    # Make node an actual xmlElement, and ensure
    # Convert the element to be part of our output document
    $node = $xml.ImportNode( ([Xml]$node).DocumentElement, $true )
    
    # Select the node to insert after
    $target = $xml.SelectSingleNode($selector)
    
    # Actually insert it
    $null = $target.ParentNode.InsertAfter($node, $target)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 2017-12-09
      • 1970-01-01
      相关资源
      最近更新 更多