我希望我能为这个脚本驼峰得到一点帮助。我试图解析这个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;,所以脚本永远不会进一步。
我已经查看了这个脚本很长一段时间了,我无法弄清楚如何纠正这个问题。非常感谢任何指导!如果有更好的方法,我也很高兴听到这个。
答案 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)"