Анализ отчета о метриках кода XML с использованием Powershell

Я надеюсь, что смогу получить небольшую помощь в этом горбе со сценариями. Я пытаюсь разобрать этот 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>

Это фрагмент кода C#, который я сейчас использую для анализа приведенного выше XML.

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 оценивается как «Data.dll» вместо имени элемента «Metrics», поэтому сценарий никогда не продвигается дальше.

Я довольно долго просматривал этот скрипт и не могу понять, как это исправить. Любое руководство очень ценится! Если есть лучший способ, я тоже был бы рад услышать об этом.


person Steve L.    schedule 23.09.2014    source источник


Ответы (2)


К вашему сведению, вы также можете сделать это с помощью XPath в PowerShell:

$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)"
person Keith Hill    schedule 24.09.2014

person    schedule
comment
Спасибо ребята! Я собираюсь попробовать оба и посмотреть, какой из них работает лучше для меня. - person Steve L.; 24.09.2014