2012-04-02 100 views
2

我写了下面的代码来算一个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(串) ':并不是所有的代码路径都返回一个值。

+3

再次读取错误'不是所有的代码路径都返回一个值' – 2012-04-02 16:43:02

回答

6

您没有返回值。

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

return nodeCount; 
+0

非常感谢。这工作。 – user1255009 2012-04-02 16:44:18

+1

@ user1255009单击此答案编号旁边的复选框将其标记为“答案”。 – 2012-04-02 17:20:37

1

你指定的返回类型,但你不随地返回任何东西。

2

您的方法的签名告诉它它有一个返回类型Dictionary<string, int>

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

1

其他人都说过的话。

我看其他两个问题:

首先,XmlDocument.Load(string)需要文件名不是XML数据。要做到这一点,您需要使用LoadXml()方法。

其次,它看起来像你试图按名称计算节点。为什么要编写代码来遍历XML树?让框架为你工作。不写代码的代码你不必测试或调试。

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

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

写的XPath表达式为您提供了一组特定需要的节点和使用Linq的对象来构建字典,这样的:

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

相关问题