2016-09-18 3 views
0

Ich versuche, folgende XML-Datei in PowerShell-Wörterbuch zu konvertieren.Wie leere XML-Elemente in PowerShell-Wörterbuch konvertiert werden

<configuration> 
    <environment id="Test"> 
     <client>ABC</client> 
     <type>Test</type> 
     <template> </template> 
     <targetmachines> 
      <targetmachine> 
       <name>Any</name> 
       <remotedirectory>C:\ServiceDirectory</remotedirectory> 
      </targetmachine> 
     </targetmachines> 
     <connectionStrings> 
      <DB1>User ID=xx;password=xx=;</DB1> 
      <DB2>User ID=yy;password=yy=;</DB2> 
     </connectionStrings> 
    </environment> 
</configuration> 

Hier ist mein Powershell-Skript:

$environmentId = "Test" 
$configxml = [xml] (Get-Content "xmlfile") 

$keyValuePairs = New-Object "System.Collections.Generic.Dictionary``2[System.String,System.String]" 
$configxml.SelectNodes("descendant::configuration/environment[@id='$($environmentId)']/descendant::text()[normalize-space()]") | Where-Object {$_.Value} | 
ForEach-Object { 
       $keyValuePairs.Add($_.ParentNode.ToString(), $_.Value) 
       } 
Write-Output $keyValuePairs 

ich folgende Ausgabe bekommen:

Key                  Value                 
---                  -----                 
client                 ABC                  
type                  Test                 
name                  Any                  
remotedirectory               C:\ServiceDirectory              
DB1                  User ID=xx;password=xx=;            
DB2                  User ID=yy;password=yy=; 

Der obige Powershell-Skript funktioniert gut. Aber ich möchte folgende Ausgabe. Der Unterschied hier ist, dass wir einen Extra-Schlüssel namens "Template" haben, der einen leeren Wert hat. Ich möchte leere Wertelemente in ein Wörterbuch umwandeln.

Kann mir bitte jemand vorschlagen, wie ich mein Powershell-Skript aktualisiere. Danke im Voraus.

+0

'.//configuration/environment[@id='$($environmentId)']//* [not (*)] ' – PetSerAl

+0

Hi, Getting following error, Ausnahme" SelectNodes "mit" 1 "Argument (en): " 'Nachkommen :: Konfiguration/Umgebung [@ id =' Test ']/Nachkommen: : * [nicht (*)] 'hat ein ungültiges Token. " – mahesh

+0

Ich weiß nicht warum, aber StackOverflow fügt zwei nicht druckbare Zeichen nach 'not' ein. Sie müssen sie entfernen. – PetSerAl

Antwort

0

Dies sollte das tun, was Sie brauchen:

$xml = [xml]'<configuration> 
    <environment id="Test"> 
     <client>ABC</client> 
     <type>Test</type> 
     <template> </template> 
     <targetmachines> 
      <targetmachine> 
       <name>Any</name> 
       <remotedirectory>C:\ServiceDirectory</remotedirectory> 
      </targetmachine> 
     </targetmachines> 
     <connectionStrings> 
      <DB1>User ID=xx;password=xx=;</DB1> 
      <DB2>User ID=yy;password=yy=;</DB2> 
     </connectionStrings> 
    </environment> 
</configuration>' 
$environmentId = "Test" 

$dictionary = New-Object 'System.Collections.Generic.Dictionary[string,string]' 
$xml.SelectNodes("//configuration/environment[@id='$environmentId']//*[not(*)]") | ` 
    % { $dictionary.Add($_.Name,$_.InnerText) } 

Wörterbuch Inhalt

Key    Value     
---    -----     
client    ABC      
type    Test      
template         
name    Any      
remotedirectory C:\ServiceDirectory  
DB1    User ID=xx;password=xx=; 
DB2    User ID=yy;password=yy=; 
+0

Dyl, Vielen Dank. es funktioniert gut. Könnten Sie mir bitte sagen, was ist _ * [nicht (*)] ") |' _ Bedeutung? Nochmals vielen Dank. – mahesh

Verwandte Themen