AngleSharp by Florian Rappl

<PackageReference Include="AngleSharp" Version="0.8.1" />

 QueryExtensions

static class QueryExtensions
Extensions for performing QuerySelector operations.
using AngleSharp.Dom; using AngleSharp.Dom.Collections; using AngleSharp.Dom.Css; using AngleSharp.Parser.Css; using System; using System.Collections.Generic; using System.Diagnostics; namespace AngleSharp.Extensions { [DebuggerStepThrough] internal static class QueryExtensions { public static IElement QuerySelector(this INodeList elements, string selectors) { ISelector selector = CssParser.ParseSelector(selectors, null); if (selector == null) throw new DomException(ErrorCode.Syntax); return elements.QuerySelector(selector); } public static HtmlElementCollection QuerySelectorAll(this INodeList elements, string selectors) { ISelector selector = CssParser.ParseSelector(selectors, null); if (selector == null) throw new DomException(ErrorCode.Syntax); List<IElement> list = new List<IElement>(); elements.QuerySelectorAll(selector, list); return new HtmlElementCollection(list); } public static HtmlElementCollection QuerySelectorAll(this INodeList elements, ISelector selector) { List<IElement> list = new List<IElement>(); elements.QuerySelectorAll(selector, list); return new HtmlElementCollection(list); } public static HtmlElementCollection GetElementsByClassName(this INodeList elements, string classNames) { List<IElement> list = new List<IElement>(); string[] array = classNames.SplitSpaces(); if (array.Length != 0) elements.GetElementsByClassName(array, list); return new HtmlElementCollection(list); } public static HtmlElementCollection GetElementsByTagName(this INodeList elements, string tagName) { List<IElement> list = new List<IElement>(); elements.GetElementsByTagName((tagName != "*") ? tagName : null, list); return new HtmlElementCollection(list); } public static HtmlElementCollection GetElementsByTagName(this INodeList elements, string namespaceUri, string localName) { List<IElement> list = new List<IElement>(); elements.GetElementsByTagName(namespaceUri, (localName != "*") ? localName : null, list); return new HtmlElementCollection(list); } public static T QuerySelector<T>(this INodeList elements, ISelector selectors) where T : class, IElement { return elements.QuerySelector(selectors) as T; } public static IElement QuerySelector(this INodeList elements, ISelector selector) { for (int i = 0; i < elements.Length; i++) { IElement element = elements[i] as IElement; if (element != null) { if (selector.Match(element)) return element; if (element.HasChildNodes) { element = element.ChildNodes.QuerySelector(selector); if (element != null) return element; } } } return null; } public static void QuerySelectorAll(this INodeList elements, ISelector selector, List<IElement> result) { for (int i = 0; i < elements.Length; i++) { IElement element = elements[i] as IElement; if (element != null) { if (selector.Match(element)) result.Add(element); if (element.HasChildNodes) element.ChildNodes.QuerySelectorAll(selector, result); } } } public static bool Contains(this ITokenList list, string[] tokens) { for (int i = 0; i < tokens.Length; i++) { if (!list.Contains(tokens[i])) return false; } return true; } public static void GetElementsByClassName(this INodeList elements, string[] classNames, List<IElement> result) { for (int i = 0; i < elements.Length; i++) { IElement element = elements[i] as IElement; if (element != null) { if (element.ClassList.Contains(classNames)) result.Add(element); if (element.ChildElementCount != 0) element.ChildNodes.GetElementsByClassName(classNames, result); } } } public static void GetElementsByTagName(this INodeList elements, string tagName, List<IElement> result) { for (int i = 0; i < elements.Length; i++) { IElement element = elements[i] as IElement; if (element != null) { if (tagName == null || element.NodeName.Equals(tagName, StringComparison.OrdinalIgnoreCase)) result.Add(element); if (element.ChildElementCount != 0) element.ChildNodes.GetElementsByTagName(tagName, result); } } } public static void GetElementsByTagName(this INodeList elements, string namespaceUri, string localName, List<IElement> result) { for (int i = 0; i < elements.Length; i++) { IElement element = elements[i] as IElement; if (element != null) { if (element.NamespaceUri == namespaceUri && (localName == null || element.LocalName.Equals(localName, StringComparison.OrdinalIgnoreCase))) result.Add(element); if (element.ChildElementCount != 0) element.ChildNodes.GetElementsByTagName(namespaceUri, localName, result); } } } } }