计算后更新XML节点值

时间:2012-02-14 13:07:22

标签: powershell powershell-v2.0

我的XML如下所示

<Components>
  <Component>
    <Name>Comp1</Name>
    <Baseline>Comp1_2.1.0.20.2824</Baseline>
    <KLOC>0</KLOC>
    <IsCount>True</IsCount>
    </Component>
  <Component>
    <Name>Comp2</Name>
    <Baseline>Comp2_2_7_2012.3171</Baseline>
    <KLOC>0</KLOC>
    <IsCount>True</IsCount>
  </Component>
</Components>

我有日志文件名,如Comp1.log,Comp2.log等。

Comp1代码计数应该转到组件名称Comp1的KLOC标签。

以下是查找获取代码计数的逻辑。我们的代码计数将在以下日志文​​件中提供。

  

总行数(第2版):1084

我将使用以下逻辑终止除版本号之外的字符串。

    $Files=Get-ChildItem -Path  $CCountFolder -Recurse
    $Totallinesver2+= Get-ChildItem -Path $CCountFolder -Recurse | Foreach { Get-Content $_.FullName | Select-string -simplematch "Total Lines (version 2)" }

        Foreach ( $line in $Totallinesver2) { $Count+= ($line -replace "Total Lines \(version 2\)        : ","" )}
        $count
Foreach ($file in $Files) { $file.Name }

现在我想将KLOC存储在相应的组件KLOC标签中。

1 个答案:

答案 0 :(得分:1)

使用一点XPath,你可以获得text()节点的句柄并设置它的值。

更新:要根据解析文件的名称使Xpath查询动态化,可以使用GetFileNameWithoutExtension方法。只要文件名与XML中的组件名匹配,这就可以工作。添加代码以检索$count循环中的foreach变量。

$doc = [xml] (Get-Content "C:\InputFile.xml")
$compFiles = 'Comp1.log', 'Comp2.log'

foreach ($file in $compFiles) {

    # Get $count from $file here...

    $compName = [IO.Path]::GetFileNameWithoutExtension($file)
    $xpath = "//Component[Name='${compName}']/KLOC/text()"
    $node = $doc.SelectSingleNode($xpath)
    $node.Value = $count
}

$doc.Save("C:\Output.xml")