/// <summary>
        /// タグを指定して その 子要素も含めて削除する
        /// </summary>
        /// <param name="tag"></param>
        public void RemoveTokenAndChild(Token tag)
        {
            int pos = this.TokenList.IndexOf(tag);
            if (pos >= 0)
            {
                string endTagName = "/" + tag.TagName;
                // 次の /frame を探す
                var tagEnd = this.TokenList.Skip(pos)
                    .Where(r => string.Equals(r.TagName,endTagName,StringComparison.OrdinalIgnoreCase))
                    .FirstOrDefault();

                if (tagEnd != null)
                {
                    int endPos = this.TokenList.IndexOf(tagEnd);
                    if (endPos > pos)
                    {
                        List<Token> deleteList = new List<Token>();
                        for (int i = pos; i <= endPos; i++)
                        {
                            deleteList.Add(this.TokenList[i]);
                        }
                        // 実際に削除
                        foreach (var token in deleteList)
                        {
                            token._dom = null;
                            this.TokenList.Remove(token);
                        }
                    }
                }
            }
        }
        private Token read_token()
        {
            if (ch == EOF)
            {
                currentToken = null;
                return null;
            }
            else if (ch == '<' && ch_next == '!' && ch_next_next == '-' && ch_next_next_next == '-')
            {
                // コメントの終了を探す
                // IEの仕様は <!--> もコメントとして判断するので・・それと同様の動きをする。

                StringBuilder sb = new StringBuilder();
                sb.Append((char)ch);
                read_ch();
                while (ch != EOF)
                {
                    if (ch == '-' && ch_next == '-' && ch_next_next == '>')
                    {
                        sb.Append((char)ch);
                        read_ch();
                        sb.Append((char)ch);
                        read_ch();
                        sb.Append((char)ch);
                        read_ch();
                        break;
                    }
                    else
                    {
                        sb.Append((char)ch);
                    }

                    read_ch();
                }
                Token token = new Token();
                token.TokenType = TokenTypeEnum.Comments;
                token.RawString = sb.ToString();
                currentToken = token;
                return token;

            }
            else if (ch == '<' && (!is_space_char(ch_next)))
            {
                // タグ
                StringBuilder sb = new StringBuilder();
                sb.Append((char)ch);
                read_ch();

                bool tagEndFlag = false;
                // タグの開始
                while (ch != EOF)
                {
                    sb.Append((char)ch);

                    if (ch == '"' || ch == '\'')
                    {
                        char find_char = (char)ch;
                        read_ch();
                        while (ch != EOF)
                        {
                            if (ch == find_char)
                            {
                                sb.Append((char)ch);
                                break;
                            }
                            sb.Append((char)ch);
                            read_ch();
                        }
                    }
                    else if (ch == '>')
                    {
                        // タグの終了
                        read_ch();
                        tagEndFlag = true;
                        break;
                    }
                    read_ch();
                }
                string rawStr = sb.ToString();

                Token token = new Token();
                if (tagEndFlag == false)
                {
                    // タグだと思ったが途中で終了
                    token.TokenType = TokenTypeEnum.Literal;
                    token.RawString = rawStr;
                }
                else if (rawStr.Length > 2)
                {
                    // タグ
                    token.TokenType = TokenTypeEnum.HtmlTag;
                }
                else
                {
                    // それ以外の文字
                    token.TokenType = TokenTypeEnum.Literal;
                }
                token.RawString = rawStr;
                currentToken = token;
                return token;
            }
            else
            {
                // タグの可能性のある文字 < が来るまでは Literal として登録
                StringBuilder sb = new StringBuilder();
                sb.Append((char)ch);
                read_ch();

                while (ch != EOF)
                {
                    if (ch != '<')
                    {
                        sb.Append((char)ch);
                        read_ch();
                    }
                    else
                    {
                        break;
                    }
                }
                Token token = new Token();
                token.TokenType = TokenTypeEnum.Literal;
                token.RawString = sb.ToString();
                currentToken = token;
                return token;
            }
        }