如何在powershell中从哈希表值附加xml

如何在powershell中从哈希表值附加xml,xml,powershell,powershell-2.0,Xml,Powershell,Powershell 2.0,我有一个哈希表,其中组件名作为键,基线作为值 下面几行描述了我的哈希表 Name Value ---- -----

我有一个哈希表,其中组件名作为键,基线作为值

下面几行描述了我的哈希表

Name                           Value                                                                                                                           
----                           -----                                                                                                                                       
Comp_Bin                       Comp_12_23_2011.1276                                                                            
Complicen                      Comp_11_2_2011.461                                               
SupportComp                    Comp_2.1.0.17.1135                                                                                                  
我想将这个值添加到已经可用的xml文件中

<Component>
    <Name></Name>
    <Baseline></Baseline>
    <KLOC>0</KLOC>
    <IsCount>True</IsCount>
</Component>
以下是使用XmlDocument的一种方法:

以下是使用XmlDocument的一种方法:


这似乎是在做你需要的事情:

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>

这似乎是在做你需要的事情:

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>

这将处理现有文件。这是您的输入文件:

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

这将处理现有文件。这是您的输入文件:

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

这个答案是在xml文件中创建所有元素。但在我的例子中,我需要将Name和Baseline元素添加到现有的XML中。但在我的例子中,我需要将Name和Baseline元素添加到现有的XML中。将字符串转换为[XML]与创建XmlDocument并加载它完全相同。我之所以说强制转换,是因为[xml]不是一种类型,而是一种类型加速器。我完全同意你的观点,我只是不想使用它。将字符串强制转换为[xml]与创建XmlDocument并加载它完全相同。我之所以说强制转换,是因为[xml]不是一种类型,而是一种类型加速器。我完全同意你的观点,我只是不想使用它。
<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")