慢速选择单节点

3 .net xml performance .net-3.5

我有一个简单的结构化 XML 文件,如下所示:

<ttest ID="ttest00001", NickName="map00001"/>
<ttest ID="ttest00002", NickName="map00002"/>
<ttest ID="ttest00003", NickName="map00003"/>
<ttest ID="ttest00004", NickName="map00004"/>
Run Code Online (Sandbox Code Playgroud)

..... 这个 xml 文件大约有 2.5MB。

在我的源代码中,我将有一个循环来获取昵称

在每个循环中,我都有这样的内容:

nickNameLoopNum = MyXmlDoc.SelectSingleNode("//ttest[@ID=' + testloopNum + "']").Attributes["NickName"].Value
Run Code Online (Sandbox Code Playgroud)

这条线将花费我 30 到 40 毫秒。

我搜索了一些旧文章(可以追溯到 2002 年)说,使用某种编译的“xpath”可以帮助解决这种情况,但那是 5 年前的事了。我想知道是否有现代做法可以使其更快?(我使用的是.NET 3.5)

Dim*_*hev 5

在 XPath 表达式中使用“ //”缩写会导致效率低下,因为它会导致搜索整个 XML 文档。重复使用 ' //' 会加剧这种低效率。

该问题的一种有效解决方案NickName是通过仅评估一个 XPath 表达式来获取所有“”属性节点:

   ttest/@NickName

其中上下文节点是所有“ ttest”元素的父节点。

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;
Run Code Online (Sandbox Code Playgroud)

这里我们假设“ttest”元素是 xml 文档顶部元素的子元素。

总而言之,提出了一种有效的解决方案,它仅对 XPath 表达式求值一次,并将所有结果放入方便的 IEnumerable 对象(可以用作数组)中,以便及时访问任何所需的项目O(c)