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

本文关键字:代码 路径 返回值 错误 | 更新日期: 2023-09-27 18:29:50

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

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

您没有返回值。

在方法末尾需要一个 return 语句,在本例中:

return nodeCount;

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

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

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

其他人都说了什么。

我看到另外两个问题:

首先,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 对象来构建字典,从而:

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