//------------------------------------------------- public Node RelativeNode(NodeRelationships Relationship_in) { Node nodePrev = _PrevNode; Node nodeNext = _NextNode; Node nodeRoot = this; Node nodeSib = this; Node nodeChild = null; while (true) { if ((Relationship_in == NodeRelationships.None)) { break; } else if ((Relationship_in == NodeRelationships.PrevNode)) { return(_PrevNode); } else if ((Relationship_in == NodeRelationships.NextNode)) { return(_NextNode); } else if ((Relationship_in == NodeRelationships.FirstNode)) { if ((nodePrev == null)) { return(this); } if ((nodePrev._PrevNode == null)) { return(nodePrev); } nodePrev = nodePrev._PrevNode; } else if ((Relationship_in == NodeRelationships.LastNode)) { if ((nodeNext == null)) { return(this); } if ((nodeNext._NextNode == null)) { return(nodeNext); } nodeNext = nodeNext._NextNode; } else if ((Relationship_in == NodeRelationships.RootNode)) { if ((nodePrev == null)) { return(nodeRoot); } if ((nodePrev._Indent < nodeRoot._Indent)) { nodeRoot = nodePrev; } nodePrev = nodePrev._PrevNode; } else if ((Relationship_in == NodeRelationships.ParentNode)) { if ((nodePrev == null)) { break; } if ((nodePrev._Indent < _Indent)) { return(nodePrev); } nodePrev = nodePrev._PrevNode; } else if ((Relationship_in == NodeRelationships.PrevSibNode)) { if ((nodePrev == null)) { break; } if ((nodePrev._Indent < _Indent)) { break; } if ((nodePrev._Indent == _Indent)) { return(nodePrev); } nodePrev = nodePrev._PrevNode; } else if ((Relationship_in == NodeRelationships.NextSibNode)) { if ((nodeNext == null)) { break; } if ((nodeNext._Indent < _Indent)) { break; } if ((nodeNext._Indent == _Indent)) { return(nodeNext); } nodeNext = nodeNext._NextNode; } else if ((Relationship_in == NodeRelationships.FirstSibNode)) { if ((nodePrev == null)) { return(nodeSib); } if ((nodePrev._Indent < _Indent)) { return(nodeSib); } if ((nodePrev._Indent == _Indent)) { nodeSib = nodePrev; } nodePrev = nodePrev._PrevNode; } else if ((Relationship_in == NodeRelationships.LastSibNode)) { if ((nodeNext == null)) { return(nodeSib); } if ((nodeNext._Indent < _Indent)) { return(nodeSib); } if ((nodeNext._Indent == _Indent)) { nodeSib = nodeNext; } nodeNext = nodeNext._NextNode; } else if ((Relationship_in == NodeRelationships.FirstChildNode)) { if ((nodeNext == null)) { break; } if ((nodeNext._Indent <= _Indent)) { break; } if ((nodeNext._Indent == (_Indent + 1))) { return(nodeNext); } nodeNext = nodeNext._NextNode; } else if ((Relationship_in == NodeRelationships.LastChildNode)) { if ((nodeNext == null)) { return(nodeChild); } if ((nodeNext._Indent <= _Indent)) { return(nodeChild); } if ((nodeNext._Indent == (_Indent + 1))) { nodeChild = nodeNext; } nodeNext = nodeNext._NextNode; } else if ((Relationship_in == NodeRelationships.FirstDescNode)) { if ((nodeNext != null)) { if ((nodeNext._Indent > _Indent)) { return(nodeNext); } } break; } else if ((Relationship_in == NodeRelationships.LastDescNode)) { if ((nodeNext == null)) { return(nodeChild); } if ((nodeNext._Indent <= _Indent)) { return(nodeChild); } if ((nodeNext._Indent > _Indent)) { nodeChild = nodeNext; } nodeNext = nodeNext._NextNode; } else { break; } } return(null); }
public static IEnumerable <HtmlNode> GetNodesThatMatchTheCondition(this HtmlNode node, NodeRelationships relationship, MarkerAttributes markerAttribute) { // TODO: refactor this! switch (relationship) { case NodeRelationships.Self: var result = node.HasAttribute(markerAttribute) ? new List <HtmlNode> { node } : new List <HtmlNode> { null }; return(result); case NodeRelationships.Sibling: // TODO: write better code! return(new List <HtmlNode> { null }); case NodeRelationships.Parent: return(node.ParentNode.HasAttribute(markerAttribute) ? new List <HtmlNode> { node.ParentNode } : new List <HtmlNode> { null }); case NodeRelationships.Ancestor: return(node.Ancestors().Any(ancestor => ancestor.HasAttribute(markerAttribute)) ? node.Ancestors().Where(ancestor => ancestor.HasAttribute(markerAttribute)).ToList() : new List <HtmlNode> { null }); case NodeRelationships.Child: return(node.ChildNodes.Any(childNode => childNode.HasAttribute(markerAttribute)) ? node.ChildNodes.Where(childNode => childNode.HasAttribute(markerAttribute)).ToList() : new List <HtmlNode> { null }); //return node.SelectNodes("*").Any(childNode => childNode.HasAttribute(markerAttribute)) // ? node.SelectNodes("*").Where(childNode => childNode.HasAttribute(markerAttribute)).ToList() // : new List<HtmlNode> { null }; case NodeRelationships.Descendant: //return node.Descendants().Any(descendant => descendant.HasAttribute(markerAttribute)) // ? node.Descendants().Where(childNode => childNode.HasAttribute(markerAttribute)).ToList() // : new List<HtmlNode> { null }; var result2 = node.Descendants().Any(descendant => descendant.HasAttribute(markerAttribute)) ? node.Descendants().Where(childNode => childNode.HasAttribute(markerAttribute)).ToList() : new List <HtmlNode> { null }; //var result2 = node.SelectNodes("*").Any(descendant => descendant.HasAttribute(markerAttribute)) // ? node.SelectNodes("*").Where(childNode => childNode.HasAttribute(markerAttribute)).ToList() // : new List<HtmlNode> { null }; return(result2); default: return(new List <HtmlNode> { null }); } }