То, что сказали все остальные.
Я вижу две другие проблемы:
Сначала 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
.