Ошибка: не все пути кода возвращают значение - PullRequest
2 голосов
/ 02 апреля 2012

Я написал следующий код для подсчета узла файла 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 ]

6 голосов
/ 02 апреля 2012

Вы не возвращаете значение.

Вам нужен оператор возврата в конце вашего метода, в данном случае:

return nodeCount;
2 голосов
/ 02 апреля 2012

Подпись вашего метода говорит о том, что он имеет тип возврата Dictionary<string, int>.

В вашем методе ExtractNodeInfo у вас нет return.

1 голос
/ 02 апреля 2012

Вы указали тип возврата, но нигде ничего не возвращаете.

0 голосов
/ 02 апреля 2012

То, что сказали все остальные.

Я вижу две другие проблемы:

Сначала 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.
  • /* список из одного элемента, корневого элемента документа, независимо от его имени. Возможно, вы захотите использовать метод 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...