コード例 #1
0
ファイル: TextElement.cs プロジェクト: turkmvc/TextEngine
        public TextElements GetElementsHasAttributes(string name, bool depthscan = false, int limit = 0)
        {
            var elements = new TextElements();
            var lower    = name.ToLower();

            for (int i = 0; i < this.subElements.Count; i++)
            {
                var elem = this.subElements[i];
                if (elem.ElemAttr.Count > 0 && lower == "*")
                {
                    elements.Add(elem);
                }
                else
                {
                    if (elem.ElemAttr.HasAttribute(lower))
                    {
                        elements.Add(elem);
                    }
                }

                if (depthscan && elem.SubElementsCount > 0)
                {
                    elements.AddRange(elem.GetElementsHasAttributes(name, depthscan));
                }
            }
            return(elements);
        }
コード例 #2
0
ファイル: TextElement.cs プロジェクト: turkmvc/TextEngine
        public TextElements FindByXPath(string xpath)
        {
            var elements  = new TextElements();
            var xpathItem = XPathItem.ParseNew(xpath);

            elements = this.FindByXPathByBlockContainer(xpathItem.XPathBlockList);
            elements.SortItems();
            return(elements);
        }
コード例 #3
0
ファイル: TextElement.cs プロジェクト: turkmvc/TextEngine
        public TextElements GetElementsByPath(List <XPathBlock> block)
        {
            TextElements elements = new TextElements();

            for (int i = 0; i < this.SubElementsCount; i++)
            {
                var subelem = this.SubElements[i];
                if (subelem.ElementType != TextElementType.ElementNode)
                {
                    continue;
                }
                for (int j = 0; j < block.Count; j++)
                {
                    var curblock = block[j];
                    if (curblock.IsAttributeSelector)
                    {
                        if (curblock.BlockName == "*")
                        {
                            if (subelem.ElemAttr.Count == 0)
                            {
                                continue;
                            }
                        }
                        else
                        {
                            if (!subelem.ElemAttr.HasAttribute(curblock.BlockName))
                            {
                                continue;
                            }
                        }
                    }
                    else
                    {
                        if (curblock.BlockName != "*" && curblock.BlockName != subelem.ElemName)
                        {
                            continue;
                        }
                    }
                    if (elements.Contains(subelem) || (curblock.XPathExpressions.Count == 0 || XPathActions.XExpressionSuccess(subelem, curblock.XPathExpressions)))
                    {
                        elements.Add(subelem);
                        XPathActions.Eliminate(elements, curblock);
                    }
                    break;
                }
            }


            return(elements);
        }
コード例 #4
0
        private TextElements GetNotClosedPrevTagUntil(TextElement tag, string name)
        {
            var array = new TextElements();
            var stag  = this.GetNotClosedPrevTag(tag);

            while (stag != null)
            {
                if (stag.ElemName == name)
                {
                    array.Add(stag);
                    break;
                }
                array.Add(stag);
                stag = this.GetNotClosedPrevTag(stag);
            }
            return(array);
        }
コード例 #5
0
ファイル: TextElement.cs プロジェクト: turkmvc/TextEngine
        public TextElements FindByXPathBlockList(XPathBlocks blocks, TextElements senderlist = null)
        {
            var elements = senderlist;

            for (int i = 0; i < blocks.Count; i++)
            {
                var xblock = blocks[i];
                if (i == 0 && senderlist == null)
                {
                    elements = FindByXPath(xblock);
                }
                else
                {
                    elements = elements.FindByXPath(xblock);
                }
            }
            return(elements);
        }
コード例 #6
0
ファイル: TextElements.cs プロジェクト: turkmvc/TextEngine
        public TextElements FindByXPath(XPathBlock xblock)
        {
            TextElements elements = new TextElements();

            for (int j = 0; j < this.Count; j++)
            {
                var elem      = this[j];
                var nextelems = elem.FindByXPath(xblock);
                for (int k = 0; k < nextelems.Count; k++)
                {
                    if (elements.Contains(nextelems[k]))
                    {
                        continue;
                    }
                    elements.Add(nextelems[k]);
                }
            }
            return(elements);
        }
コード例 #7
0
ファイル: TextElement.cs プロジェクト: turkmvc/TextEngine
        public TextElements FindByXPath(XPathBlock block)
        {
            TextElements foundedElems = new TextElements();

            if (block.IsAttributeSelector)
            {
                foundedElems = this.GetElementsHasAttributes(block.BlockName, block.BlockType == XPathBlockType.XPathBlockScanAllElem);
            }
            else
            {
                if (!string.IsNullOrEmpty(block.BlockName))
                {
                    if (block.BlockName == ".")
                    {
                        foundedElems.Add(this);
                        return(foundedElems);
                    }
                    else if (block.BlockName == "..")
                    {
                        foundedElems.Add(this.Parent);
                        return(foundedElems);
                    }
                    else
                    {
                        foundedElems = this.GetElementsByTagName(block.BlockName, block.BlockType == XPathBlockType.XPathBlockScanAllElem);
                    }
                }
            }
            if (block.XPathExpressions.Count > 0 && foundedElems.Count > 0)
            {
                for (int i = 0; i < block.XPathExpressions.Count; i++)
                {
                    var exp = block.XPathExpressions[i];
                    foundedElems = XPathActions.Eliminate(foundedElems, exp);
                    if (foundedElems.Count == 0)
                    {
                        break;
                    }
                }
            }
            return(foundedElems);
        }
コード例 #8
0
ファイル: TextElement.cs プロジェクト: turkmvc/TextEngine
        public TextElements FindByXPathPar(XPathPar xpar, TextElements senderitems = null)
        {
            var elements = new TextElements();

            elements = this.FindByXPathByBlockContainer(xpar.XPathBlockList, senderitems);
            if (xpar.XPathExpressions.Count > 0 && elements.Count > 0)
            {
                elements.SortItems();
                for (int j = 0; j < xpar.XPathExpressions.Count; j++)
                {
                    var exp = xpar.XPathExpressions[j];
                    elements = XPathActions.Eliminate(elements, exp);
                    if (elements.Count == 0)
                    {
                        break;
                    }
                }
            }
            return(elements);
        }
コード例 #9
0
ファイル: TextElement.cs プロジェクト: turkmvc/TextEngine
        private TextElements FindByXPathByBlockContainer(XPathBlockContainer container, TextElements senderitems = null)
        {
            var  elements = new TextElements();
            bool inor     = true;

            for (int i = 0; i < container.Count; i++)
            {
                var curblocks = container[i];
                if (curblocks.IsOr())
                {
                    inor = true;
                    continue;
                }
                if (!inor)
                {
                    if (curblocks.IsBlocks())
                    {
                        elements = this.FindByXPathBlockList(curblocks as XPathBlocks, elements);
                    }
                    else
                    {
                        elements.AddRange(this.FindByXPathPar(curblocks as XPathPar, senderitems));
                    }
                }
                else
                {
                    if (curblocks.IsBlocks())
                    {
                        elements.AddRange(this.FindByXPathBlockList(curblocks as XPathBlocks));
                    }
                    else
                    {
                        elements.AddRange(this.FindByXPathPar(curblocks as XPathPar));
                    }
                }

                inor = false;
            }

            return(elements);
        }
コード例 #10
0
ファイル: TextElement.cs プロジェクト: turkmvc/TextEngine
        public TextElements GetElementsByTagName(string name, bool depthscan = false, int limit = 0)
        {
            var elements = new TextElements();
            var lower    = name.ToLower();

            for (int i = 0; i < this.subElements.Count; i++)
            {
                var elem = this.subElements[i];
                if (elem.ElemName.ToLower() == lower || lower == "*")
                {
                    elements.Add(elem);
                    if (limit > 0 && elements.Count >= limit)
                    {
                        break;
                    }
                }
                if (depthscan && elem.SubElementsCount > 0)
                {
                    elements.AddRange(elem.GetElementsByTagName(name, depthscan));
                }
            }
            return(elements);
        }
コード例 #11
0
ファイル: TextElement.cs プロジェクト: turkmvc/TextEngine
        public TextElements FindByXPathOld(string xpath)
        {
            var            elements   = new TextElements();
            XPathFunctions fn         = new XPathFunctions();
            var            xpathblock = XPathItem.Parse(xpath);
            XPathActions   actions    = new XPathActions();

            actions.XPathFunctions = new XPathFunctions();
            for (int i = 0; i < xpathblock.XPathBlocks.Count; i++)
            {
                var xblock = xpathblock.XPathBlocks[i];
                if (i == 0)
                {
                    elements = FindByXPath(xblock);
                }
                else
                {
                    TextElements newelements = new TextElements();
                    for (int j = 0; j < elements.Count; j++)
                    {
                        var elem      = elements[j];
                        var nextelems = elem.FindByXPath(xblock);
                        for (int k = 0; k < nextelems.Count; k++)
                        {
                            if (newelements.Contains(nextelems[k]))
                            {
                                continue;
                            }
                            newelements.Add(nextelems[k]);
                        }
                    }
                    elements = newelements;
                }
            }
            return(elements);
        }