MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Как создать html-документ в C# программно"
Answer 830256
Класс 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.