如何在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")