private static void EmitCreateDocument(ILGenerator il, IHtmlDocument document) { //create document //dup document, document //st container document //begin create element //ld provider document, provider //ld container document, provider, document //ld ElementName document, provider, document, name //create element document, element //dup document, element, element //st container document, element //begin create textNode //ld provider document, element, provider //ld container document, element, provider, element //ld text document, element, provider, element, text //create text document, element, textNode //pop document, element //end create textNode //end create element //pop document //dup document, document //st container document //end create document //complete document //ret if (document.DocumentUri == null) { il.Emit(OpCodes.Ldnull); } else { il.Emit(OpCodes.Ldstr, document.DocumentUri.AbsoluteUri); il.Emit(OpCodes.Newobj, NewUri); } il.Emit(OpCodes.Callvirt, CreateDocument); il.Emit(OpCodes.Dup); il.Emit(OpCodes.Stloc_0);// set container; foreach (var node in document.Nodes()) { EmitCreateNode(il, node); } }
/// <summary> /// 创建文档的副本 /// </summary> /// <param name="provider">用于创建副本文档的 IHtmlDomProvider 对象</param> /// <param name="document">要创建副本的文档</param> /// <returns>文档的副本</returns> public static IHtmlDocument MakeCopy(this IHtmlDomProvider provider, IHtmlDocument document) { var copy = provider.CreateDocument(document.DocumentUri); copy.AddCopy(provider, document.Nodes()); return(copy); }
private static void EmitCreateDocument( ILGenerator il, IHtmlDocument document ) { //init provider //CreateDocument document //dup document, document //st container document //ld provider document, provider //ld container document, provider, document //ld spec document, provider, document, specS //SetHtmlSpecifi document, spec //pop document //begin create element //ld provider document, provider //ld container document, provider, document //ld ElementName document, provider, document, name //create element document, element //dup document, element, element //st container document, element //begin create textNode //ld provider document, element, provider //ld container document, element, provider, element //ld text document, element, provider, element, text //create text document, element, textNode //pop document, element //end create textNode //end create element //pop document //dup document, document //st container document //end create document //complete document //ret if ( document.DocumentUri == null ) il.Emit( OpCodes.Ldnull ); else { il.Emit( OpCodes.Ldstr, document.DocumentUri.AbsoluteUri ); il.Emit( OpCodes.Newobj, NewUri ); } il.Emit( OpCodes.Callvirt, CreateDocument ); il.Emit( OpCodes.Dup ); il.Emit( OpCodes.Stloc_0 );// set container; il.Emit( OpCodes.Ldarg_0 ); il.Emit( OpCodes.Ldloc_0 ); il.Emit( OpCodes.Castclass, typeof( IHtmlDocument ) ); il.Emit( OpCodes.Ldstr, document.HtmlSpecification.ToString() ); il.Emit( OpCodes.Callvirt, SetHtmlSpecification ); il.Emit( OpCodes.Pop ); foreach ( var node in document.Nodes() ) EmitCreateNode( il, node ); }
private static void EmitCreateDocument(ILGenerator il, IHtmlDocument document) { //init provider //CreateDocument document //dup document, document //st container document //ld provider document, provider //ld container document, provider, document //ld spec document, provider, document, specS //SetHtmlSpecifi document, spec //pop document //begin create element //ld provider document, provider //ld container document, provider, document //ld ElementName document, provider, document, name //create element document, element //dup document, element, element //st container document, element //begin create textNode //ld provider document, element, provider //ld container document, element, provider, element //ld text document, element, provider, element, text //create text document, element, textNode //pop document, element //end create textNode //end create element //pop document //dup document, document //st container document //end create document //complete document //ret if (document.DocumentUri == null) { il.Emit(OpCodes.Ldnull); } else { il.Emit(OpCodes.Ldstr, document.DocumentUri.AbsoluteUri); il.Emit(OpCodes.Newobj, NewUri); } il.Emit(OpCodes.Callvirt, CreateDocument); il.Emit(OpCodes.Dup); il.Emit(OpCodes.Stloc_0);// set container; il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldloc_0); il.Emit(OpCodes.Castclass, typeof(IHtmlDocument)); il.Emit(OpCodes.Ldstr, document.HtmlSpecification.ToString()); il.Emit(OpCodes.Callvirt, SetHtmlSpecification); il.Emit(OpCodes.Pop); foreach (var node in document.Nodes()) { EmitCreateNode(il, node); } }