c# – HtmlAgilityPack SelectNodes表达式忽略具有特定属性的元素

前端之家收集整理的这篇文章主要介绍了c# – HtmlAgilityPack SelectNodes表达式忽略具有特定属性的元素前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图选择除脚本节点以外的节点和一个名为’relativeNav’的类的ul.有人可以指引我走正确的道路吗?我已经搜索了一个星期,我无法在任何地方找到它.目前我有这个,但它显然也选择了// ul [@ class =’relativeNav’].反正是否有一个NOT表达式,以便SelectNode会忽略那个? @H_404_2@foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//body//*[not(self::script)]/text()")) { Console.WriteLine("Node: " + node); singleString += node.InnerText.Trim() + "\n"; }

解决方法

给定一个Html文档,其结构类似于: @H_404_2@<html> <head><title>HtmlDocument</title> </head> <body> <div> <span>Hello Span World</span> <script> Script Text </script> </div> <ul class='relativeNav'> <li>Hello </li> <li>Li</li> <li>World</li> </ul> </body> </html>

以下XPath表达式将选择所有不是脚本元素的节点,不包括具有类“relativeNav”的UL元素的所有子元素:

@H_404_2@var nodes = htmlDoc.DocumentNode.SelectNodes("//body//*[not(parent::ul[@class='relativeNav']) and not(self::script)]/text()");

更新:忘记提及如果您需要排除ul [class =’relativeNav’]的任何子项而不管其深度如何,您应该使用:

@H_404_2@"//body//*[not(ancestor::ul[@class='relativeNav']) and not(self::script)]/text()"

如果你想排除ul元素(在上面的例子中有些不相关,因为元素不包含文本),你应该指定:

@H_404_2@"//body//*[not(ancestor-or-self::ul[@class='relativeNav']) and not(self::script)]"

猜你在找的C#相关文章