使用HtmlAgilityPack计算特定子节点

我在HtmlAgilityPack中使用的这个XPath选项有很多麻烦。

我想选择嵌套在另一个li所有li元素(如果它们存在),其中有a带有id="menuItem2" a标记。 这是html示例:

  

这是我一直在使用的XPath。 当我丢失这部分/ul/li ,它会给我a我想要a标签,但我需要他的后代…这个XPath总是返回null。

 string xpathExp = "//a[@id='" + parentIdHtml + "']/ul/li"; HtmlNodeCollection liNodes = htmlDoc.DocumentNode.SelectNodes(xpathExp); 

以下XPath应该可以工作。

 string xpathExp = "//li/a[@id='" + parentIdHtml + "']/following-sibling::ul/li"; 

试试你的xpath:

 string xpathExp = "//li[a/@id='" + parentIdHtml + "']/ul/li"; 

问题是你选择了a没有ul子节点的节点本身。 您需要先选择li节点,然后对其子节点进行过滤。

XPath太乱了。 你正在使用HtmlAgilityPack,你也可以利用LINQ。

 //find the li -- a *little* complicated with nested Where clauses, but clear enough. HtmlNode li = htmlDoc.DocumentNode.Descendants("li").Where(n => n.ChildNodes.Where(a => a.Name.Equals("a") && a.Id.Equals("menuItem2", StringComparison.InvariantCultureIgnoreCase)).Count() > 0).FirstOrDefault(); IEnumerable liNodes = null; if (li != null) { //Node found, get all the descendent 
  • liNodes = li.Descendants("li"); }
  • 根据您的描述,我想您想要选择包含带有ids menuSubItem1menuSubItem2 标签的两个

  • 元素?

    如果是这样,那么这就是你所需要的

     //li[a/@id="menuItem2"]//li