问题描述
|
我想将我的Asics运行计划导出到iCal,并且由于Asics不提供此服务,因此我决定为自己的用途制造一些刮板。我要做的是从我的计划中获取所有计划的运行,并基于此生成iCal提要。我正在使用C#和HTML Agility Pack。
我想做的是遍历所有计划的运行(它们是div节点)。接下来,我想选择几个与运行节点不同的节点。我的代码如下所示:
foreach (var run in doc.DocumentNode.SelectSingleNode(\"//div[@id=\'scheduleTable\']\").SelectNodes(\"//div[@class=\'pTdBox\']\"))
{
number++;
string date = run.SelectSingleNode(\"//div[@class=\'date\']\").InnerText;
string type = run.SelectSingleNode(\"//span[@class=\'menu\']\").InnerHtml;
string distance = run.SelectSingleNode(\"//span[@class=\'distance\']\").InnerHtml;
string description = run.SelectSingleNode(\"//div[@class=\'description\']\").InnerHtml;
ViewData[\"result\"] += \"Dato: \" + date + \"<br />\";
ViewData[\"result\"] += \"Tyep: \" + type + \"<br />\";
ViewData[\"result\"] += \"Distance: \" + distance + \"<br />\";
ViewData[\"result\"] += \"Description: \" + description + \"<br />\";
ViewData[\"result\"] += run.InnerHtml.Replace(\"<\",\"<\").Replace(\">\",\">\") + \"<br />\" + \"<br />\" + \"<br />\";
}
我的问题是ѭ1不会在给定的运行节点中选择具有给定XPath的节点。它选择与整个文档中的XPath匹配的第一个节点。
如何在当前节点内选择具有给定XPath的单个节点?
谢谢。
更新资料
我尝试将XPath字符串更新为此:
string date = run.SelectSingleNode(\".div[@class=\'date\']\").InnerText;
这应该选择当前节点中的“ 3”元素,对吗?好吧,我尝试了这个,但是遇到了这个错误:
表达式必须计算为
节点集。说明:未处理
发生在
当前Web请求的执行。
请查看堆栈跟踪以获取更多信息
有关错误以及位置的信息
它起源于代码。
异常详细信息:
System.Xml.XPath.XPathException:
表达式必须计算为
节点集。
有什么建议么?
解决方法
使用HtmlAgilityPack和XPath表达式时,有几件事会对您有所帮助。
如果
run
是HtmlNode
,则:
run.SelectNodes(\"//div[@class=\'date\']\")
将表现得完全像doc.DocumentNode.SelectNodes(\"//div[@class=\'date\']\")
run.SelectNodes(\"./div[@class=\'date\']\")
将为您提供所有属于“ 4”节点的子节点的“ 9”节点。它只会在下一个深度级别进行更深入的搜索。
run.SelectNodes(\".//div[@class=\'date\']\")
将返回所有具有该class属性的<div>
节点,但不仅返回run
节点旁边,还将返回深度搜索(它的每个后代)
您将必须在2.或3.之间进行选择,具体取决于哪一个满足您的需求:)
, 在XPATH中,“ 14”表示当前节点以下的所有子代和大子代。因此,您需要提出一个限制性更强的XPATH表达式。如果您提供真实的HTML,以及您正在寻找的确切内容,我们可以帮助您进一步挖掘。
关于您遇到的错误:
.div[@class=\'date\']
无效,因为在div
上贴有.
。您可以使用div[@class=\'date\']
或./div[@class=\'date\']
,我认为它们是等效的。这是因为ѭ16是XPATH轴,是self
的别名,表示\“当前节点\”。