示例#1
0
            //-------------------------------------------------
            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
                });
            }
        }