Как добавить xml из значений хеш-таблицы в powershell - PullRequest
1 голос
/ 07 января 2012

У меня есть хеш-таблица, в которой имена компонентов указаны как ключевые, а базовые значения - как значения.

Следующие строки изображают мою хэш-таблицу

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>

Добавление значения хеша в xml и сделать его следующим образом

<Components>
   <Name>Comp_Bin</Name>
   <Baseline>Comp_12_23_2011.1276</Baseline>
   <KLOC>0</KLOC>
   <IsCount>True</IsCount>
</Component>

Как преобразовать хеш-таблицу в xml? пожалуйста, помогите мне.

Я проанализировал мою хеш-таблицу, как показано ниже, но следующий код завершился ошибкой, поскольку содержимое XML необходимо копировать каждый раз, а затем изменять только элементы Name и Baseline

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

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

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

Ответы [ 3 ]

2 голосов
/ 07 января 2012

Это, кажется, делает то, что вам нужно:

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>
2 голосов
/ 08 января 2012

Это будет обрабатывать существующий файл.Это ваш входной файл:

<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 голос
/ 07 января 2012

Вот способ использования 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...