在PowerShell中删除重复的XML节点

时间:2015-10-02 18:27:10

标签: xml powershell

我有一个类似于以下内容的XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
  <software>
    <name>MozillaFirefox</name>
    <version>31.3.0</version>
    <installer_location>/Mozilla/Firefox/31.3.0.exe</installer_location
  </software>
  <software>
    <name>GoogleChrome</name>
    <version>35.7</version>
    <installer_location>/Google/Chrome/35.7.msi</installer_location
  </software>
  <software>
    <name>MozillaFirefox</name>
    <version>33.4.0</version>
    <installer_location>/Mozilla/Firefox/33.4.0.exe</installer_location>
    </software>
</catalog>

这是我目前的代码:

#Load XML file into $catalogXML
[xml]$catalogXML = (Get-Content (C:\test.xml))

$softwareVersionsArray = $catalogXML.catalog.software

哪个输出:

name             version      installer_location
----             -------      ------------------ 
MozillaFirefox   31.3.0       /Mozilla/Firefox/31.3.0.exe
GoogleChrome     35.7         /Google/Chrome/35.7.msi
MozillaFirefox   33.4.0       /Mozilla/Firefox/33.4.0.exe

我需要协助编码,以便删除任何重复项,并且第一个条目是保留的条目(即显示Firefox 31.3.0并删除Firefox 33.3.4)。我尝试了各种XPath语句和Select -Unique过滤器无济于事。在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

要获得所需的结果,您可以按name分组元素:Group-Object name;然后从每个组中选择第一个元素:ForEach-Object {$_.Group[0]}

$catalogXML.catalog.software|
Group-Object name|
ForEach-Object {$_.Group[0]}

答案 1 :(得分:0)

您还可以执行以下操作:

<xsl:for-each select="//name[not(preceding::name/. = .)]>
  <xsl:value-of select=".">
</xsl:for-each>