使用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"); }