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

Posted

技术标签:

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

读取此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 问题。 【参考方案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();
    

【讨论】:

以上是关于如何在 c# 中读取由代码度量生成的这个 xml 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 c# 读取此代码覆盖率 xml 文件报告

如何在 C# 中读取此 XML?

C# 如何读取xml文件并输出信息到label上

如何在不写入磁盘的情况下将 XML 从 Delphi 传递到 C#?

如何在 C# 中读取 XML

有人可以帮我在c#中解决这个问题吗