错误:并非所有代码路径都返回值

时间:2012-04-02 16:39:24

标签: c# function methods dictionary error-handling

我编写了以下代码来计算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)':并非所有代码路径都返回一个值。

4 个答案:

答案 0 :(得分:6)

您没有返回值。

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

return nodeCount;

答案 1 :(得分:2)

您的方法的签名表明它的返回类型为Dictionary<string, int>

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

其他人都说了什么。

我还看到另外两个问题:

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

其次,看起来你正在尝试按名称计算节点。为什么要编写代码来遍历XML树?让框架为您服务。代码你没有编写代码,你不必测试或调试。

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

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

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

SelectSingleNode()

鉴于上述情况,

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//*" ) ;

就会为任何深度的每个子节点生成一个按名称频率计数的字典。