Exemplo n.º 1
0
        // 针对集合中的元素进行 XPath 筛选
        // 本函数不怕同一批元素之间有重叠关系。所采用的策略是一批一批单独筛选,然后把输出结果合成
        // parameters:
        //      nMaxCount    至多选择开头这么多个元素。-1表示不限制
        /// <summary>
        /// 针对当前集合中的全部元素进行 XPath 选择
        /// </summary>
        /// <param name="strXPath">XPath字符串</param>
        /// <param name="nMaxCount">限制命中的最大元素个数。如果为 -1,表示不限制</param>
        /// <returns>选中的元素所构成的新集合</returns>
        public MarcNodeList select(string strXPath, int nMaxCount /* = -1*/)
        {
            // 把当前集合分割为每段内部确保互相不重叠
            List <MarcNodeList> lists = new List <MarcNodeList>();

            {
                MarcNodeList segment = new MarcNodeList();  // 当前累积的段落
                foreach (MarcNode node in this)
                {
                    if (segment.count > 0)
                    {
                        if (isCross(node, segment) == true)
                        {
                            // 推走
                            lists.Add(segment);
                            segment = new MarcNodeList();
                        }
                    }
                    segment.add(node);
                }

                // 最后剩下的
                if (segment.count > 0)
                {
                    lists.Add(segment);
                }
            }


            MarcNodeList results = new MarcNodeList();

            foreach (MarcNodeList segment in lists)
            {
                // 对一批互相没有树重叠关系的对象进行筛选
                MarcNodeList temp = simpleSelect(segment,
                                                 strXPath,
                                                 -1);
                foreach (MarcNode node in temp)
                {
                    if (results.indexOf(node) == -1)
                    {
                        results.add(node);
                    }
                }

                if (nMaxCount != -1 && results.count >= nMaxCount)
                {
                    if (results.count > nMaxCount)
                    {
                        return(results.getAt(0, nMaxCount));
                    }
                    break;
                }
            }
            return(results);
        }