2012-01-07 13 views
1

コンポーネント名がKeyとBaselineの値として含まれているハッシュテーブルがあります。powershellのハッシュテーブル値からxmlを追加する方法

次の行が

<Components> 
    <Name>Comp_Bin</Name> 
    <Baseline>Comp_12_23_2011.1276</Baseline> 
    <KLOC>0</KLOC> 
    <IsCount>True</IsCount> 
</Component> 
を次のように

Name       Value                               
----       -----                                  
Comp_Bin      Comp_12_23_2011.1276                    
Complicen      Comp_11_2_2011.461            
SupportComp     Comp_2.1.0.17.1135                         

が、私はそれをXMLに利用できるxmlファイルすでに

<Component> 
    <Name></Name> 
    <Baseline></Baseline> 
    <KLOC>0</KLOC> 
    <IsCount>True</IsCount> 
</Component> 

が追加されたハッシュ値にこの値を追加したいと思い、私のハッシュテーブル描きます

ハッシュテーブルをxmlに変換するには?私を助けてください。ここではその後、単独の名前とベースラインの要素を変更するたびにコピーする必要があり

私は以下のように私のハッシュテーブルを解析されてきたが、次のコードは、XMLコンテンツとして失敗し

$CCountDoc= [XML] (Get-Content "ccount.xml") 
    foreach($key in $($hash.keys)){ 

    $Baseline = $hash[$key] 
    $Name= $key 

    $CCountDoc.Name=$Name 
    $CCountDoc.Baseline=$Baseline 
    } 

答えて

2

これは既存のファイルを処理します。

<Components> 
    <Component> 
    <Name></Name> 
    <Baseline></Baseline> 
    <KLOC>0</KLOC> 
    <IsCount>True</IsCount> 
    </Component> 
</Components> 

がに変換されます:これはあなたの入力ファイルです

<Components> 
    <Component> 
    <Name>Complicen</Name> 
    <Baseline>Comp_11_2_2011.461</Baseline> 
    <KLOC>0</KLOC> 
    <IsCount>True</IsCount> 
    </Component> 
    <Component> 
    <Name>SupportComp</Name> 
    <Baseline>Comp_2.1.0.17.1135</Baseline> 
    <KLOC>0</KLOC> 
    <IsCount>True</IsCount> 
    </Component> 
    <Component> 
    <Name>Comp_Bin</Name> 
    <Baseline>Comp_12_23_2011.1276</Baseline> 
    <KLOC>0</KLOC> 
    <IsCount>True</IsCount> 
    </Component> 
</Components> 

そして、ここのコードです:

clear 
$hash = @{ "Comp_Bin" = "Comp_12_23_2011.1276"; "Complicen" = "Comp_11_2_2011.461"; "SupportComp" = "Comp_2.1.0.17.1135" } 
$keys = New-Object object[] $hash.Count 
$hash.Keys.CopyTo($keys,0) 

$xml = [xml] [System.IO.File]::ReadAllText("c:\pst\1.xml") 
$node = $xml.Components.Component.Clone() 

$xml.Components.Component.Name = $keys[0] 
$xml.Components.Component.Baseline = $hash[$keys[0]] 

for($i = 1; $i -lt $hash.Count; $i++) 
{ 
$node.Name = $keys[$i] 
$node.Name 

$node.Baseline = $hash[$keys[$i]] 
$importNode = $xml.ImportNode($node, $true) 
$xml.Components.AppendChild($importNode) | Out-Null 
} 
$xml.Save("c:\PST\result.xml") 
1

XmlDocumentを使用しての方法です。

これはあなたが必要なものをやっているように見える
Clear-Host 
$hTable = @{"Comp_Bin"="Comp_12_23_2011.1276";"Complicen"="Comp_11_2_2011.461";"SupportComp"="Comp_2.1.0.17.1135"} 

# Create XML root 
[xml]$xmlDoc = New-Object system.Xml.XmlDocument 
$xmlDoc.LoadXml("<?xml version=`"1.0`" encoding=`"utf-8`"?><Root></Root>") 


foreach($entry in $hTable.keys) 
{ 
    Write-Host 
    # Create a text nod 
    $xmlCpn = $xmlDoc.CreateElement("Component") 

    $xmlElt = $xmlDoc.CreateElement("Name") 
    $xmlText = $xmlDoc.CreateTextNode($entry) 
    $null = $xmlElt.AppendChild($xmlText) 
    $null = $xmlCpn.AppendChild($xmlElt) 

    $xmlElt = $xmlDoc.CreateElement("Baseline") 
    $xmlText = $xmlDoc.CreateTextNode($hTable[$entry]) 
    $null = $xmlElt.AppendChild($xmlText) 
    $null = $xmlCpn.AppendChild($xmlElt) 

    $xmlElt = $xmlDoc.CreateElement("KLOC") 
    $xmlText = $xmlDoc.CreateTextNode("0") 
    $null = $xmlElt.AppendChild($xmlText) 
    $null = $xmlCpn.AppendChild($xmlElt) 

    $xmlElt = $xmlDoc.CreateElement("IsCount") 
    $xmlText = $xmlDoc.CreateTextNode("True") 
    $null = $xmlElt.AppendChild($xmlText) 
    $null = $xmlCpn.AppendChild($xmlElt) 

    # Add the nod to the document 
    $null = $xmlDoc.LastChild.AppendChild($xmlCpn); 
} 

# Backup to file 
$xmlDoc.Save("c:\Temp\Component.xml") 
+0

に文字列を "キャスト" '[XML]'正確ですXmlDocumentを作成して読み込むのと同じです。 '[xml]'は型ではなく_accelerator_型であるため、 "キャスト"と言います。 – x0n

+0

私はあなたに完全に同意する私はそれを使用する考えがありません。 – JPBlanc

2

clear 
$hash = @{ "Comp_Bin" = "Comp_12_23_2011.1276"; "Complicen" = "Comp_11_2_2011.461"; "SupportComp" = "Comp_2.1.0.17.1135" } 

$xml = [xml] "<root namespace=`"namespace`"></root>" 
foreach($key in $hash.Keys) 
{ 
$insert = [xml] [string]::Format("<Component> 
    <Name>{0}</Name> 
    <Baseline>{1}</Baseline> 
    <KLOC>0</KLOC> 
    <IsCount>True</IsCount> 
    </Component> 
    ", $key, $hash[$key]) 
$importNode = $xml.ImportNode($insert.DocumentElement, $true) 
$xml.root.AppendChild($importNode) |Out-Null 
} 
$xml.Save("c:\PST\result.xml") 

これは出力ファイルになります:

<root namespace="namespace"> 
    <Component> 
    <Name>Complicen</Name> 
    <Baseline>Comp_11_2_2011.461</Baseline> 
    <KLOC>0</KLOC> 
    <IsCount>True</IsCount> 
    </Component> 
    <Component> 
    <Name>SupportComp</Name> 
    <Baseline>Comp_2.1.0.17.1135</Baseline> 
    <KLOC>0</KLOC> 
    <IsCount>True</IsCount> 
    </Component> 
    <Component> 
    <Name>Comp_Bin</Name> 
    <Baseline>Comp_12_23_2011.1276</Baseline> 
    <KLOC>0</KLOC> 
    <IsCount>True</IsCount> 
    </Component> 
</root> 
+0

この回答は、xmlファイルのすべての要素を作成しています。しかし、私の場合、私は名前とベースライン要素を既存のXMLに追加する必要があります。 – Samselvaprabu

関連する問題