/// <summary> /// 处理结束标签 /// </summary> /// <param name="endTag">结束标签信息</param> /// <returns>相关的元素对象,若不支持则返回null</returns> protected virtual IHtmlElement ProcessEndTag( HtmlEndTag endTag ) { var tagName = endTag.TagName; if ( ContainerStack.OfType<IHtmlElement>().Select( e => e.Name ).Contains( tagName, StringComparer.OrdinalIgnoreCase ) ) { IHtmlElement element; while ( true ) { element = ContainerStack.Pop() as IHtmlElement; if ( element.Name.EqualsIgnoreCase( tagName ) ) break; } return element; } else { ProcessEndTagMissingBeginTag( endTag ); return null; } //无需退出CData标签,读取器会自动退出 }
/// <summary> /// 处理丢失了开始标签的结束标签 /// </summary> /// <param name="endTag">结束标签信息</param> protected virtual void ProcessEndTagMissingBeginTag( HtmlEndTag endTag ) { //如果堆栈中没有对应的开始标签,则将这个结束标签解释为文本 CreateTextNode( endTag.Html ); }
/// <summary> /// 处理丢失了开始标签的结束标签 /// </summary> /// <param name="endTag">结束标签信息</param> protected override void ProcessEndTagMissingBeginTag( HtmlEndTag endTag ) { //忽略多出的结束标签 }