2

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

我想选择li嵌套在另一个li女巫中的所有元素(如果它们存在)a带有id="menuItem2". 这是html示例:

<div id="menu">
  <ul>
    <li><a id="menuItem1"></a></li>
    <li><a id="menuItem2"></a>
       <ul>
          <li><a id="menuSubItem1"></a></li>
          <li><a id="menuSubItem2"></a></li>
       </ul>
    </li>  
    <li><a id="menuItem3"></a></li>
  </ul>
</div>

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

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

4 回答 4

1

以下 XPath 应该可以工作。

string xpathExp = "//li/a[@id='" + parentIdHtml + "']/following-sibling::ul/li";
于 2012-05-30T22:29:06.190 回答
0

从您的描述中,我认为您想选择<li>包含带有 id和?的<a>标签的两个元素menuSubItem1menuSubItem2

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

//li[a/@id="menuItem2"]//li
于 2012-05-31T04:01:15.853 回答
0

为您的 xpath 试试这个:

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

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

于 2012-05-30T22:20:50.167 回答
0

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<HtmlNode> liNodes = null;
if (li != null)
{
    //Node found, get all the descendent <li>
    liNodes = li.Descendants("li");
}
于 2012-05-30T22:41:28.017 回答