【问题标题】:How to read this xml file generated by code metrics, in c#如何在 c# 中读取由代码度量生成的这个 xml 文件
【发布时间】:2023-03-25 06:32:01
【问题描述】:

读取此xml文件以获取方法名称及其圈值 这是xml文件,我需要读取圈复杂度值,并将方法名称和包含该方法的类存储在一个对象中。

<?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>

【问题讨论】:

  • read 是什么意思?问题是什么? .NET 有很多方法可以读取 XML 和搜索特定元素和值。有很多关于 XmlDocument、XDocument、XPath 或 LINQ to XML 的 SO 问题。

标签: c# .net xml visual-studio


【解决方案1】:

你可以试试下面的代码,使用linq to xml获取所有的循环值和对应的方法名和类名。

        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();

结果:

【讨论】:

  • 谢谢,这可以工作,但我不必阅读所有的圈复杂度,我只需要阅读方法的圈复杂度,以及包含该方法的类的名称。请根据此更新此代码
  • @Priya Rani,我已经更新了,你可以看看它是否适合你。
  • 是的,非常感谢,我也做了同样的事情。我还编辑了你的代码。非常感谢
  • 能否请您编写代码来读取此xml文件,如上c#中的代码。我需要覆盖率小于 95 的那些程序集的名称...... xml 文件是......我在前一个 @jack 中附加
  • @Priya Rani,你最好提出一个新问题。
【解决方案2】:

我对您的代码做了一些小改动,得到了我需要的确切结果

  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();
    }

【讨论】:

    猜你喜欢
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 2013-04-07
    相关资源
    最近更新 更多