我有一个简单的结构化XML文件,如下所示:<ttest ID="ttest00001", NickName="map00001"/><ttest ID="ttest00002", NickName="map00002"/><ttest ID="ttest00003", NickName="map00003"/><ttest ID="ttest00004", NickName="map00004"/>…这个XML文件大约为2.5MB。在我的源代码中,我将有一个循环来获取昵称在每个循环中,我都有这样的东西:nickNameLoopNum = MyXmlDoc.SelectSingleNode("//ttest[@ID=' + testloopNum + "']").Attributes["NickName"].Value这条线要花我30到40毫秒。我搜索了一些老文章(可以追溯到2002年)说,使用某种编译过的“xpath”可以帮助解决这个问题,但那是5年前的事了。我想知道有没有一个现代化的做法,使它更快?(我正在使用.NET 3.5) 最佳答案 在xpath表达式中使用“//”缩写会导致很大的效率低下,因为它会导致搜索整个xml文档。反复使用“//”会使这种效率倍增。解决此问题的一个有效方法是通过只计算一个xpath表达式来获取所有“NickName”属性节点:其中上下文节点是所有“ttest/@NickName”元素的父节点。C代码将如下所示: int n = 15; XmlDocument doc = new XmlDocument(); doc.Load("MyFile.xml"); XmlNodeList nodeList; XmlNode top = doc.DocumentElement; nodeList = top.SelectNodes("ttest/@NickName"); // Get the N-th NickName, can be done in a loop for // all n in a range string nickName = nodeList[n].Value;在这里,我们假设“ttest”元素是xml文档顶部元素的子元素。总之,提出了一种有效的解决方案,它只对xpath表达式求值一次,并将所有结果放入一个方便的ienumerable对象(可以用作数组)中,以便在ttest时间内访问任何所需的项。关于.net - 慢选择单节点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/385272/
10-09 19:54