使用Powershell解析XML代码度量报告

时间:2014-09-23 18:08:41

标签: c# xml powershell xml-parsing powershell-v3.0

我希望我能为这个脚本驼峰得到一点帮助。我试图解析这个XML。目前它是通过C#完成的,但我试图在PowerShell中重新编写它。

<CodeMetricsReport Version="10.0">
  <Targets>
    <Target Name="C:\Builds\APP\APP_v1.0.0\Data.dll">
      <Modules>
        <Module Name="Data.dll" AssemblyVersion="1.0.0" FileVersion="1.0.0">
          <Metrics>
            <Metric Name="MaintainabilityIndex" Value="84" />
            <Metric Name="CyclomaticComplexity" Value="39" />
            <Metric Name="ClassCoupling" Value="14" />
            <Metric Name="DepthOfInheritance" Value="1" />
            <Metric Name="LinesOfCode" Value="101" />
          </Metrics>
        </Module>
      </Modules>
    </Target>
  </Targets>      
</CodeMetricsReport>

这是我目前用于解析上述XML的C#代码片段。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(MetricsFileName);

XmlNodeList modules = xmlDoc.SelectNodes("/CodeMetricsReport/Targets/Target/Modules/Module");
foreach (XmlNode module in modules)
{
  foreach (XmlNode nodes in module)
  {
    switch (nodes.Name)
    {                        
      case "Metrics":
      foreach (XmlNode metric in nodes)
      {
        switch (metric.Attributes["Name"].Value)
        {
          case "MaintainabilityIndex":
          Console.WriteLine("MaintainabilityIndex={0}", metric.Attributes["Value"].Value);                                        
          break;
        }
      }
    }
  }
}

这是我迄今为止提出的PowerShell,但我遇到了一些麻烦。

[xml]$xmlDoc = New-Object System.Xml.XmlDocument
$xmlDoc.Load($MetricsFileName)

$modules = $xmlDoc.SelectNodes("/CodeMetricsReport/Targets/Target/Modules/Module")
foreach ($module in $modules)
{
  foreach ($nodes in $module)
  {
    Switch ($nodes.Name)
    {
      "Metrics"
      {
        foreach ($metric in $nodes)
        {
          Switch ($metric.Attributes["Name"].Value)
          {
            "MaintainabilityIndex"
            {
              Write-Host ("MaintainabilityIndex={0}" -f $metric.Attributes["Value"].Value) 
            }
          }       
        }
      }  
    }
  }
}

当脚本到达Switch语句时,$ nodes.Name计算为&#34; Data.dll&#34;而不是元素名称&#34; Metrics&#34;,所以脚本永远不会进一步。

我已经查看了这个脚本很长一段时间了,我无法弄清楚如何纠正这个问题。非常感谢任何指导!如果有更好的方法,我也很高兴听到这个。

2 个答案:

答案 0 :(得分:1)

$xml = [xml] (Get-Content $MetricsFileName)
foreach ($metric in $xml.CodeMetricsReport.Targets.Target.Modules.Module.Metrics.Metric) {
    switch ($metric.Name) {
        'MaintainabilityIndex' {
            Write-Host "MaintainabilityIndex=$($metric.Value)"
        }
    }
}

答案 1 :(得分:1)

仅供参考,您可以在PowerShell中使用XPath执行此操作:

$xml = [xml](Get-Content foo.xml)
$selectInfo = Select-Xml -Xml $xml -XPath '/CodeMetricsReport/Targets/Target/Modules/Module/Metrics/Metric[@Name="MaintainabilityIndex"]'
"MaintainabilityIndex=$($selectInfo.Node.Value)"