【问题标题】:Error: Not all code paths return a value错误:并非所有代码路径都返回值
【发布时间】:2012-04-16 08:11:37
【问题描述】:

我写了以下代码来统计一个 XML 文件的节点数:

private Dictionary<string, int> ExtractNodeInfo(string fileContent)
    {
        XmlDocument xmlDocument;
        xmlDocument = new XmlDocument();
        xmlDocument.Load(fileContent);
        var ediNodes = xmlDocument.DocumentElement.SelectNodes("/EDI");
        Dictionary<string, int> nodeCount = new Dictionary<string, int>();
        foreach (XmlNode nodes in ediNodes)
        {
            FileManager.nodeRecurse(nodes, nodeCount);
        }

        foreach (var entry in nodeCount)
        {
            Console.WriteLine(entry.ToString());
        }
    }

但它给了我以下错误:'XmlFileManager.FileManager.ExtractNodeInfo(string)': 并非所有代码路径都返回一个值。

【问题讨论】:

  • 再次读取错误not all code paths return a value

标签: c# function methods dictionary error-handling


【解决方案1】:

您没有返回值。

你需要在你的方法结束时有一个 return 语句,在这种情况下:

return nodeCount;

【讨论】:

  • @user1255009 单击此答案编号旁边的复选框以将其标记为“答案”。
【解决方案2】:

您的方法的签名表明它的返回类型为Dictionary&lt;string, int&gt;

在您的方法ExtractNodeInfo 中,您没有return

【讨论】:

    【解决方案3】:

    你已经指定了一个返回类型,但是你没有在任何地方返回任何东西。

    【讨论】:

      【解决方案4】:

      其他人都说过的话。

      我发现另外两个问题:

      首先,XmlDocument.Load( string ) 采用 文件名 而不是 XML 数据。为此,您需要使用LoadXml() 方法。

      其次,您似乎正在尝试按名称计算节点。为什么要编写代码来遍历 XML 树?让框架为您工作。无需编写的代码无需测试或调试。

      SelectNodes( string xpathExpression ) 方法为您提供文档中与指定 XPath 表达式匹配的所有节点的平面列表。例如:

      • //* 文档中的每个节点,包括文档根,无论其在文档中的深度如何。
      • //foo/bar[@type='data'] 每个具有type 属性的bar 元素,其值为data,其直接祖先是文档中任意深度的foo 元素。
      • /EDI(你的 XPath 表达式) 文档的根节点,只要它被命名为“EDI”。
      • /EDI/*/foo 作为文档根元素EDI 的第二级子元素的所有foo 元素。
      • /* 一个元素的列表,即文档的根元素,无论其名称如何。您可能想在此处使用SelectSingleNode() 方法,因为您知道您不会得到一个以上的元素。

      编写一个 XPath 表达式,为您提供所需的特定节点集,并使用 Linq for objects 来构建字典,因此:

      private static Dictionary<string,int> CountNodesByName( TextReader reader , string xpathExpression )
      {
        XmlDocument xml = new XmlDocument() ;
        xml.Load( reader );
      
        Dictionary<string,int> instance = xml.DocumentElement
                                          .SelectNodes( xpathExpression )
                                          .Cast<XmlNode>()
                                          .GroupBy(
                                            x            => x.Name ,
                                            (name,nodes) => Tuple.Create( name , nodes.Count() )
                                            )
                                          .ToDictionary( x => x.Item1 , x => x.Item2 )
                                          ;
      
        return instance ;
      }
      

      鉴于以上情况,

      TextReader             reader          = OpenSomeXmlDataSourceForReading() ;
      Dictionary<string,int> nodeFrequencies = CountNodesByName( reader , "/EDI//*" ) ;
      

      只要根节点被命名为EDI,就会为任何深度的每个子节点生成一个按名称进行频率计数的字典。

      【讨论】:

        猜你喜欢
        • 2013-07-01
        • 2014-04-16
        • 2015-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        相关资源
        最近更新 更多