我编写了以下代码来计算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)':并非所有代码路径都返回一个值。
答案 0 :(得分:6)
您没有返回值。
在方法结束时需要一个return语句,在这种情况下:
return nodeCount;
答案 1 :(得分:2)
您的方法的签名表明它的返回类型为Dictionary<string, int>
。
在您的方法ExtractNodeInfo
中,您没有return
。
答案 2 :(得分:1)
你已经指定了一个返回类型,但你没有在任何地方返回任何内容。
答案 3 :(得分:0)
其他人都说了什么。
我还看到另外两个问题:
首先,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
一个元素的列表,即文档的根元素,无论其名称如何。你可能想在这里使用/*
方法,因为你知道你不会得到多个元素。编写一个XPath表达式,为您提供所需的特定节点集,并使用Linq为对象构建字典,因此:
SelectSingleNode()
鉴于上述情况,
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//*" ) ;
,就会为任何深度的每个子节点生成一个按名称频率计数的字典。