2012-04-02 7 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

エラーをもう一度読んでください。「すべてのコードパスが値を返すわけではありません」 –

答えて

6

値を返していません。あなたは戻り値の型を指定した

return nodeCount; 
+0

ありがとう、ありがとうございます。それはうまくいった。 – user1255009

+1

@ user1255009この回答の番号の横にあるチェックボックスをクリックすると、「回答」とマークされます。 –

1

が、あなたはどこにでも何かを返していない:

あなたはこのケースでは、あなたのメソッドの最後にreturn文が必要です。

2

メソッドのシグネチャは、戻り値の型がDictionary<string, int>であることを示します。

ExtractNodeInfoの方法では、returnはありません。

1

他の誰もが言っていること。

私は2つの他の問題を参照してください。

まず、XmlDocument.Load(string)ファイル名ないXMLデータを取りに。これを行うには、LoadXml()メソッドを使用する必要があります。

第2に、ノードを名前で数えようとしているようです。 XMLツリーを歩くコードを書いているのはなぜですか?フレームワークをあなたのために働かせてください。コードは、テストやデバッグの必要がないコードを記述しません。

メソッドSelectNodes(string xpathExpression)は、指定されたXPath式に一致するドキュメント内のすべてのノードのフラットなリストを表示します。例えば:

  • //*ドキュメントルート、ドキュメント内での深さのregardles含む文書内のすべてのノード。
  • //foo/bar[@type='data']dataあり、その直接の祖先ドキュメント内の任意の深さでfoo要素であるtype属性を持つすべての要素bar
  • /EDI(あなたのXPath式) 「EDI」という名前が付いている限り、ドキュメントのルートノードです。
  • /EDI/*/foo すべてfoo文書のルート要素の第2レベルの子である要素は、EDIです。
  • /* ドキュメントのルート要素の1つの要素の名前にかかわらず、その要素の一覧。複数の要素を返さないことがわかっているので、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である限り、任意の深さのすべての子ノードの名前で頻度カウントを持つ辞書を生成します。

関連する問題