Show / Hide Table of Contents

MSDN.WhiteKnight - Stack Overflow answers

Ответ на "Как создать html-документ в C# программно"

Answer 830256

Link

Класс HtmlDocument не содержит конструктора, позволяющего создать пустой документ. Тем не менее, можно это сделать с помощью невидимого WebBrowser:

HtmlDocument htmldoc;

//создадим WebBrowser и загрузим в него пустой документ
WebBrowser wb = new WebBrowser();         
wb.DocumentText = "";
while(wb.ReadyState != WebBrowserReadyState.Complete)Application.DoEvents();
/*На практике загрузка пустой строки произойдет очень быстро, поэтому
 можно использовать блокирующий цикл вместо подписки на событие DocumentCompleted*/

//заполним содержимое документа
htmldoc = wb.Document;
htmldoc.Title = "Hello";            

HtmlElement el = htmldoc.CreateElement("h1");
el.InnerText = "Hello, world!";
htmldoc.Body.AppendChild(el);

el = htmldoc.CreateElement("div");
el.InnerText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
htmldoc.Body.AppendChild(el);

//получаем все содержимое документа в виде html
textBox1.Text = htmldoc.GetElementsByTagName("html")[0].OuterHtml;

Или добавить ссылку на COM-библиотеку Microsoft HTML Object Library, вручную создать экземпляр класса MSHTML.HTMLDocument и затем на основе него создать HtmlDocument путем вызова его закрытого конструктора:

using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace WinFormsTest
{
    public partial class Form1 : Form
    {
        /* Создает новый пустой экземпляр HtmlDocument*/
        public static HtmlDocument CreateHtmlDocument()
        {
            Assembly winforms = typeof(Form).Assembly; //System.Windows.Forms

            //создадим служебный класс HtmlShimManager
            Type t = winforms.GetType("System.Windows.Forms.HtmlShimManager");
            object obj = Activator.CreateInstance(t, true);

            //создадим документ и загрузим в него пустую строку
            var doc = new MSHTML.HTMLDocument();
            MSHTML.IHTMLDocument2 doc2 = (MSHTML.IHTMLDocument2)doc;
            doc2.write("");
            doc2.close();

            HtmlDocument htmldoc = null;

            //создаем HtmlDocument с помощью закрытого конструктора
            htmldoc = (HtmlDocument)Activator.CreateInstance(
            typeof(HtmlDocument),
            BindingFlags.Instance | BindingFlags.NonPublic,
            null,
            new object[] { obj, doc },
            System.Globalization.CultureInfo.InvariantCulture);

            return htmldoc;
        }

        /* Освобождает неуправляемые ресурсы, принадлежащие HtmlDocument*/
        public static void ReleaseHtmlDocument(HtmlDocument doc)
        {
            Type t = typeof(HtmlDocument);
            try
            {
                IDisposable shim = (IDisposable)t.InvokeMember(
                    "shimManager",
                    BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance,
                    null, doc, new object[0]);
                shim.Dispose();                
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.ToString());
            }
            Marshal.ReleaseComObject(doc.DomDocument);
        }

        public Form1()
        {
            InitializeComponent();
        }


        private void button1_Click(object sender, EventArgs e)
        {
            HtmlDocument htmldoc;
            htmldoc    = CreateHtmlDocument(); //создадим документ

            //заполним содержимое документа
            htmldoc.Title = "Hello";

            HtmlElement el = htmldoc.CreateElement("h1");
            el.InnerText = "Hello, world!";
            htmldoc.Body.AppendChild(el);

            el = htmldoc.CreateElement("div");
            el.InnerText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
            el.Style = "color: red";
            htmldoc.Body.AppendChild(el);

            //получаем все содержимое документа в виде html
            textBox1.Text = htmldoc.GetElementsByTagName("html")[0].OuterHtml;

            //освобождаем неуправляемые ресурсы, связанные с HtmlDocument
            ReleaseHtmlDocument(htmldoc);            
        }      

    }   

}

Content is retrieved from StackExchange API.

Auto-generated by ruso-archive tools.

Back to top Stack Overflow answers (published from sources in GitHub repository). Copyright (c) 2020, MSDN.WhiteKnight. Content licensed under BSD 3-Clause License.
Generated by DocFX