如何在 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 文件的主要内容,如果未能解决你的问题,请参考以下文章