Seb*_*ank 27 c# asp.net-mvc html-agility-pack
我想将我的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 />";
}
我的问题是run.SelectSingleNode("//div[@class='date']").InnerText不在给定的运行节点中选择具有给定XPath的节点.它选择与整个文档中的XPath匹配的第一个节点.
如何在当前节点中选择具有给定XPath的单个节点?
谢谢.
更新
我尝试将我的XPath字符串更新为:
string date = run.SelectSingleNode(".div[@class='date']").InnerText;
这应该选择<div class="date"></div>当前节点中的元素,对吗?好吧,我试过这个,但得到了这个错误:
表达式必须求值为节点集.描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.
异常详细信息:System.Xml.XPath.XPathException:Expression必须求值为节点集.
有什么建议?
Osc*_*ros 58
在使用HtmlAgilityPack和XPath表达式时,有些事情可以帮助您.
如果run是HtmlNode,那么:
run.SelectNodes("//div[@class='date']")
威尔的表现就像 doc.DocumentNode.SelectNodes("//div[@class='date']")
run.SelectNodes("./div[@class='date']")
将为您提供<div>节点子run节点的所有节点.它不会更深入地搜索,只能在下一个深度级别搜索.
run.SelectNodes(".//div[@class='date']")
将返回<div>具有该类属性的所有节点,但不仅仅是在run节点旁边,而且还将深入搜索(每个可能的后代)
您必须在2.或3.之间进行选择,具体取决于哪一个满足您的需求:)
| 归档时间: | 
 | 
| 查看次数: | 12837 次 | 
| 最近记录: |