Разбор на отчет за показатели на 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