繁体   English   中英

如何在 c# 中读取由代码度量生成的 xml 文件

[英]How to read this xml file generated by code metrics, in c#

Read this xml file to get the method names and their cyclomatic value this is the xml file, i need to read the cyclomatic complexity value, and store the method name and the class containing that method in an object.

<?xml version="1.0" encoding="UTF-8"?>
    -<CodeMetricsReport Version="1.0">
    -<Targets>
    -<Target Name="ReadFileCS.csproj">
    -<Assembly Name="ReadFileCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
    -<Metrics>
    <Metric Name="MaintainabilityIndex" Value="41"/>
    <Metric Name="CyclomaticComplexity" Value="19"/>
    <Metric Name="ClassCoupling" Value="9"/>
    <Metric Name="DepthOfInheritance" Value="1"/>
    <Metric Name="SourceLines" Value="149"/>
    <Metric Name="ExecutableLines" Value="40"/>
    </Metrics>
    -<Namespaces>
    -<Namespace Name="ReadFileCS">
    -<Metrics>
    <Metric Name="MaintainabilityIndex" Value="41"/>
    <Metric Name="CyclomaticComplexity" Value="19"/>
    <Metric Name="ClassCoupling" Value="9"/>
    <Metric Name="DepthOfInheritance" Value="1"/>
    <Metric Name="SourceLines" Value="149"/>
    <Metric Name="ExecutableLines" Value="40"/>
    </Metrics>
    -<Types>
    -<NamedType Name="Program">
    -<Metrics>
    <Metric Name="MaintainabilityIndex" Value="41"/>
    <Metric Name="CyclomaticComplexity" Value="19"/>
    <Metric Name="ClassCoupling" Value="9"/>
    <Metric Name="DepthOfInheritance" Value="1"/>
    <Metric Name="SourceLines" Value="146"/>
    <Metric Name="ExecutableLines" Value="40"/>
    </Metrics>
    -<Members>
    -<Method Name="void Program.Main(string[] args)" Line="13" File="C:\Users\320117174\source\repos\ReadFileCS\ReadFileCS\Program.cs">
    -<Metrics>
    <Metric Name="MaintainabilityIndex" Value="41"/>
    <Metric Name="CyclomaticComplexity" Value="19"/>
    <Metric Name="ClassCoupling" Value="9"/>
    <Metric Name="SourceLines" Value="142"/>
    <Metric Name="ExecutableLines" Value="40"/>
    </Metrics>
    </Method>
    </Members>
    </NamedType>
    </Types>
    </Namespace>
    </Namespaces>
    </Assembly>
    </Target>
    </Targets>
    </CodeMetricsReport>

您可以尝试以下代码,使用linq 到 xml来获取所有的循环值和对应的方法名称和 Class 名称。

        string path = @"Test.xml";
        XDocument doc = XDocument.Load(path);
        var result = doc.Descendants("Metric").Where(i => i.Attribute("Name").Value == "CyclomaticComplexity");
        foreach (XElement item in result)
        {
            if(item.Parent.Parent.Name.ToString()=="Method")
            {
                Console.WriteLine(item.Attribute("Name").Value + " is " + item.Attribute("Value").Value);
                Console.WriteLine("Method is "+item.Parent.Parent.Attribute("Name").Value);
                Console.WriteLine("Class Name is "+item.Parent.Parent.Parent.Parent.Attribute("Name").Value);
            }

            Console.WriteLine("***********************");
        }

            Console.ReadKey();

结果:

在此处输入图像描述

我对您的代码进行了一些更改,并得到了我需要的确切结果

  public static void main(string[] args)
    {
     string path = @"C:\Users\320117174\source\Report1.xml";
                XDocument doc = XDocument.Load(path);
                var result = doc.Descendants("Metric").Where(i => i.Attribute("Name").Value == "CyclomaticComplexity");
                foreach (XElement item in result)
                {
                   // Console.WriteLine(item.Attribute("Name").Value + " is " + item.Attribute("Value").Value);
                    if (Convert.ToInt32(item.Attribute("Value").Value) > 5)
                    {
                       
                        if (item.Parent.Parent.Name.ToString() == "Method")
                        {
                            Console.WriteLine(item.Attribute("Name").Value + " is " + item.Attribute("Value").Value);
                            Console.WriteLine("Method is " + item.Parent.Parent.Attribute("Name").Value);
                            Console.WriteLine("Class Name is " + item.Parent.Parent.Parent.Parent.Attribute("Name").Value);
                            Console.WriteLine("***********************");
                        }
                    }
                }
    
                Console.ReadKey();
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM