2016-04-30 56 views
1

我正在尝试使用PowerShell创建一个字典。以下是xml文件,将内部xml转换为PowerShell

和我正在下面的代码,

$env = "Test" 
$myDictionary = New-Object "System.Collections.Generic.Dictionary``2[System.String,System.String]" 
$xmlfile = [xml] (Get-Content "file-name") 
$xmlfile.SelectNodes("descendant::configuration/environment[@id='$($env)']/descendant::text()[normalize-space()]") | ? Value | % { $myDictionary.Add($_.ParentNode.ToString(), $_.Value) } 

我想我的输出如下,

Key   Value 
----   ----- 
smtpserver  smtp1.org 
type   test 
encryption  <add key ="DB1" value="mhu0VrvzBBlYjPbxh+EQk0zdY"/> 
       <add key ="DB2" value="DVvHAq2EVKF5fmYYiUUJ/g=="/> 
       <add key="DB3" value="dkcdowefnwlwkli/" /> 

我想包括在内部的XML部分字典。有人可以为上述要求提出可能的解决方案吗?

在此先感谢。

回答

3

我建议使用下面的XPath,它会返回所有直接子元素匹配<environment>

//configuration/environment[@id='target_id_here']/* 

然后用$myDictionary.Add($_.ToString(), $_.InnerXml)添加的每个元素的名称和内部XML对到字典。


演示:

PS C:\Users\har07> $xml = [xml]@" 
>> <configuration> 
>> <environment id="Test"> 
>>  <smtpserver>smtp1.org</smtpserver> 
>>  <type>test</type> 
>>  <encryptioninfo> 
>>  <add key ="DB1" value="mhu0VrvzBBlYjPbxh+EQk0zdY"/> 
>>  <add key ="DB2" value="DVvHAq2EVKF5fmYYiUUJ/g=="/> 
>>  <add key="DB3" value="dkcdowefnwlwkli/" /> 
>>  </encryptioninfo> 
>> </environment> 
>> </configuration> 
>> "@ 
PS C:\Users\har07> $env = "Test" 
PS C:\Users\har07> $myDictionary = New-Object "System.Collections.Generic.Dictionary``2[System.String,System.String]" 
PS C:\Users\har07> $xml.SelectNodes("//configuration/environment[@id='$($env)']/*") | % { $myDictionary.Add($_.ToString(), $_.InnerXml) } 
PS C:\Users\har07> $myDictionary 

Key   Value 
---   ----- 
smtpserver  smtp1.org 
type   test 
encryptioninfo <add key="DB1" value="mhu0VrvzBBlYjPbxh+EQk0zdY" /><add key="DB2" value="DVvHAq2EVKF5fmYYiUUJ/g==" />... 
+0

大。非常感谢。它按预期工作.. – mahesh