C# 访问节点元素的其他方法

C# 访问节点元素的其他方法,c#,html-agility-pack,getelementbyid,C#,Html Agility Pack,Getelementbyid,在这个HTML源代码中 <strong>Apple</strong> <span id="apple">Red</span> <strong>Orange</strong> <span id="orange">Orange</span> <strong>Beans</strong> <span id="beans">Green</span> <st

在这个HTML源代码中

<strong>Apple</strong> <span id="apple">Red</span>
<strong>Orange</strong> <span id="orange">Orange</span>
<strong>Beans</strong> <span id="beans">Green</span>
<strong>Carrot</strong> <span id="carrot">Orange</span>
<strong>Banana</strong> <span id="banana">Yellow</span>
<strong>Grapes</strong> <span id="grape">Green</span>
但是代码搜索两次跨度节点需要更多的时间。我想知道是否有其他更有效的方法来访问特定的跨度元素

如果没有这些代码,源代码将通过Agility Pack更快地加载到文档中。添加此代码后,进程延迟

如果HTML源没有特定的ID,它会给出一个异常


我想将两种蔬菜颜色(绿色和橙色)分别保存在两个变量中,因为我将使用列表将其转换为逗号分隔的txt文件

我会尝试将span插入字典,假设span id是唯一的:

Dictionary<string, HtmlNode> spans = document.DocumentNode.Descendants("span")
    .Where(node => node.Attributes["id"] != null)
    .ToDictionary(node => node.Attributes["id"].Value);

或者直接获取内部文本:

Dictionary<string, string> texts = document.DocumentNode.Descendants("span")
    .Where(node => node.Attributes["id"] != null)
    .ToDictionary(node => node.Attributes["id"].Value,
                  node => node.InnerText.Trim());
或者,如果您确定span ID存在:

string apple = texts["apple"];
string orange = texts["orange"];

您可以用
.First()
@SLaks替换所有这些LINQ调用,您的意思是将元素(0)更改为.First()?此外,该页面只包含bean/carrot Span ID onceNo;我的意思是摆脱
ToArray()
您可以使用XPath来代替。@Vkt0rS。XPath会比Linq更快吗?我只是想提高代码的性能
Dictionary<string, string> texts = document.DocumentNode.Descendants("span")
    .Where(node => node.Attributes["id"] != null)
    .ToDictionary(node => node.Attributes["id"].Value,
                  node => node.InnerText.Trim());
string text;
if (texts.TryGetValue("apple", out text)) {
    Console.WriteLine(text);
}
string apple = texts["apple"];
string orange = texts["orange"];