2016-09-07 25 views
1

私の問題は、私は次のように二度同じ値を持つXMLファイルを持っていることです。XMLファイルから重複したタグを削除

<ns:html xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns="2" release="1"> 
    <ns:Name>A 
     <ns:ID>ANI-2016-05-02T21:01Z</ns:ID> 
     <ns:CreationDate>2016-05-02T21:01:40</ns:CreationDate> 
     <ns:Subname>A2 
      <ns:Total>5000</ns:Total> 
      <ns:type>ANI</ns:type> 
     </ns:Subname> 
    </ns:Name> 

    <ns:Name>A 
     <ns:ID>ANI-2016-05-02T21:01Z</ns:ID> 
     <ns:CreationDate>2016-05-02T21:01:40</ns:CreationDate> 
     <ns:Subname>A2 
      <ns:Total>5000</ns:Total> 
      <ns:type>ANI</ns:type> 
     </ns:Subname> 
    </ns:Name> 

    <ns:Name>A 
     <ns:ID>ANI-2016-08-04T21:01Z</ns:ID> 
     <ns:CreationDate>2016-04-08T21:01:40</ns:CreationDate> 
     <ns:Subname>A2 
      <ns:Total>5000</ns:Total> 
      <ns:type>ANI</ns:type> 
     </ns:Subname> 
    </ns:Name> 
</ns:html> 

私の質問は、私はXMLファイルから重複する値を削除するためにXMLを使用する方法であります新しいXMLファイルで次の結果が得られます。チェックはIDに基づいて行うことができます。

<ns:html xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns="2" release="1"> 
    <ns:Name>A 
     <ns:ID>ANI-2016-05-02T21:01Z</ns:ID> 
     <ns:CreationDate>2016-05-02T21:01:40</ns:CreationDate> 
     <ns:Subname>A2 
      <ns:Total>5000</ns:Total> 
      <ns:type>ANI</ns:type> 
     </ns:Subname> 
    </ns:Name> 

    <ns:Name>A 
     <ns:ID>ANI-2016-05-02T21:01Z</ns:ID> 
     <ns:CreationDate>2016-05-02T21:01:40</ns:CreationDate> 
     <ns:Subname>A2 
      <ns:Total>5000</ns:Total> 
      <ns:type>ANI</ns:type> 
     </ns:Subname> 
    </ns:Name> 
</ns:html> 

私は、次のことを試してみました:

まずhereが見つかったとして、私は例を使用:

## SETUP ENVIRONMENT 
# Find "Advanced Monitoring Agent" service and use path to locate files 
$gfimaxagent = Get-WmiObject Win32_Service | 
       Where-Object { $_.Name -eq 'Advanced Monitoring Agent' } 
$gfimaxexe = $gfimaxagent.PathName 
$gfimaxpath = Split-Path $gfimaxagent.PathName.Replace([char]34,"") -Parent #"Wordpress syntax highlighter bug 
$XmlFile = "C:\Users\Desktop\Test.xml" 
$Output = "C:\Users\Desktop\result.xml" 

[xml]$XmlContent = Get-Content $XmlFile 
$XmlPath = "checks" 
$Property = "uid" 
$XmlValues = @{} 
foreach ($XmlElement in $XmlContent.$XmlPath.ChildNodes) 
{ 
    $ElementValues = "" #"Wordpress syntax highlighter bug 
    foreach($XmlValue in $XmlElement.ChildNodes | Sort-Object name) 
    { 
     $ElementValues = $ElementValues + $XmlValue.Name + $XmlValue.InnerText 
    } 
    $XmlValues[$XmlElement.$Property] = $ElementValues 
} 

$XmlDuplicates = @{} 
foreach ($XmlValue in $XmlValues.Values) 
{ 
    $Items = @($XmlValues.Keys | Where { $XmlValues[$_] -eq $XmlValue }) 
    if ($Items.Count -gt 1) 
    { 
     if (!($XmlDuplicates[$Items[0]])) { $XmlDuplicates[$Items[0]] = $Items } 
    } 

} 

foreach ($XmlDuplicate in $XmlDuplicates.Keys) 
{ 
    for ($i = 1; $i -lt $XmlDuplicates[$XmlDuplicate].Count; $i++) 
    { 
     $XPath = "//" + $XmlPath + "/*[@" + $Property +"=" + $XmlDuplicates[$XmlDuplicate][$i]+"]" 
     $ChildToBeRemoved = $XmlContent.SelectSingleNode($XPath) 
     $ChildToBeRemoved.ParentNode.RemoveChild($ChildToBeRemoved) 
    } 
} 

$XmlContent.Save($Output) 

問題は、私はそれはまだ私のファイルをロードしていないソースを変更した後もでしたサイトからの元のサンプルファイルです。

ように、第2のIは、以下のコードでそれを試してみました:

[xml]$XmlDocument1 = Get-Content -Path C:\Users\EX27740\Desktop\testdubbel.xml 

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

$filename = ' C:\Users\EX27740\Desktop\Resultaat.xml' 
$catalogXML.Save($filename) 

が、エラーを得る:

At line:8 Char:1 Cannot call a null-valued expression

+0

ルートノードの例を提供できますか? –

+0

他の人があなたのためにあなたの仕事をする場所ではありません。これまでに何を試しましたか(あなたのコードを見せてください)、あなたのコード内の*特定の*問題はあなたに助けが必要ですか? –

+0

こんにちは申し訳ありませんがthodseを追加するためにそれらを今追加しました – Jarno343

答えて

0

一つの方法は、XMLノードをループにあり、任意の重複

を除去
[xml]$xml = @" 
<ns:html xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns="2" release="1"> 
    <ns:Name>A 
     <ns:ID>ANI-2016-05-02T21:01Z</ns:ID> 
     <ns:CreationDate>2016-05-02T21:01:40</ns:CreationDate> 
     <ns:Subname>A2 
      <ns:Total>5000</ns:Total> 
      <ns:type>ANI</ns:type> 
     </ns:Subname> 
    </ns:Name> 

    <ns:Name>A 
     <ns:ID>ANI-2016-05-02T21:01Z</ns:ID> 
     <ns:CreationDate>2016-05-02T21:01:40</ns:CreationDate> 
     <ns:Subname>A2 
      <ns:Total>5000</ns:Total> 
      <ns:type>ANI</ns:type> 
     </ns:Subname> 
    </ns:Name> 

    <ns:Name>A 
     <ns:ID>ANI-2016-08-04T21:01Z</ns:ID> 
     <ns:CreationDate>2016-04-08T21:01:40</ns:CreationDate> 
     <ns:Subname>A2 
      <ns:Total>5000</ns:Total> 
      <ns:type>ANI</ns:type> 
     </ns:Subname> 
    </ns:Name> 
</ns:html> 
"@ 

cls 
[email protected]() 
$xml.html.Name | ForEach-Object { 
    if($CreationDates -contains $_.CreationDate) { 
    [void]$_.ParentNode.RemoveChild($_) 
    } else { 
    $CreationDates += $_.CreationDate 
    } 
} 
#$CreationDates 
$xml.html.Name 
+0

ありがとうございます – Jarno343

関連する問題