.NET을 사용하여 HTML 코드를 동적으로 생성하는 접근 방식은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-10-18 08:32:29
원래의
815명이 탐색했습니다.

What are the Approaches to Dynamically Generate HTML Code Using .NET?

.NET 및 WebBrowser 또는 mshtml.HTMLDocument를 사용하여 동적으로 HTML 코드를 생성하는 방법

소개

.NET을 사용하여 HTML 코드를 동적으로 생성하면 웹 페이지 콘텐츠에 대한 유연성과 제어 기능이 제공됩니다. 이 문서에서는 동적 HTML 코드를 검색하기 위한 두 가지 접근 방식, 즉 System.Windows.Forms의 WebBrowser 클래스를 활용하고 Microsoft HTML 개체 라이브러리 어셈블리의 COM 인터페이스 mshtml.HTMLDocument를 활용하는 방법을 살펴봅니다.

접근 방법 1: 활용 WebBrowser

WebBrowser 클래스는 웹 페이지를 로드하고 해당 콘텐츠에 액세스하는 데 편리한 옵션입니다. 다음 코드는 WebBrowser DocumentCompleted 이벤트를 사용하여 페이지를 로드하고 HTML을 검색하는 방법을 보여줍니다.

<code class="csharp">WebBrowser wb = new WebBrowser();
wb.Navigate("https://www.google.com/#q=where+am+i");

wb.DocumentCompleted += delegate(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)wb.Document.DomDocument;
    foreach (IHTMLElement element in doc.all)
    {
        System.Diagnostics.Debug.WriteLine(element.outerHTML);
    }     
};</code>
로그인 후 복사

접근 방법 2: mshtml.HTMLDocument 활용

mshtml. HTMLDocument 인터페이스는 HTML 문서와 상호 작용하는 직접적인 방법을 제공합니다. 이를 사용하여 문자열에서 HTML을 로드하고 액세스할 수 있습니다.

<code class="csharp">mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)new mshtml.HTMLDocument();
doc.write(new System.Net.WebClient().DownloadString("https://www.google.com/#q=where+am+i"));

foreach (IHTMLElement e in doc.all)
{
    System.Diagnostics.Debug.WriteLine(e.outerHTML);
}</code>
로그인 후 복사

WebBrowser 및 mshtml.HTMLDocument의 제한 사항

WebBrowser 및 mshtml.HTMLDocument 접근 방식 모두 다음과 같습니다. 항상 완전히 렌더링된 HTML 코드를 반환하는 것은 아닙니다. 이 문제를 해결하기 위해 비동기/대기 및 취소 토큰을 사용하는 향상된 접근 방식이 참조 콘텐츠에 향상된 응답으로 제공됩니다. 이 접근 방식은 HTML 변경 사항을 동적으로 모니터링하고 완전히 렌더링되면 콘텐츠를 검색합니다.

코드 샘플

다음 최적화된 코드는 향상된 접근 방식을 보여줍니다.

<code class="csharp">using Microsoft.Win32;
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WbFetchPage
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            SetFeatureBrowserEmulation();
            InitializeComponent();
            this.Load += MainForm_Load;
        }

        async void MainForm_Load(object sender, EventArgs e)
        {
            try
            {
                var cts = new CancellationTokenSource(10000); // cancel in 10s
                var html = await LoadDynamicPage("https://www.google.com/#q=where+am+i", cts.Token);
                MessageBox.Show(html.Substring(0, 1024) + "..." ); // it's too long!
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        async Task<string> LoadDynamicPage(string url, CancellationToken token)
        {
            var tcs = new TaskCompletionSource<bool>();
            WebBrowserDocumentCompletedEventHandler handler = (s, arg) => tcs.TrySetResult(true);

            using (token.Register(() => tcs.TrySetCanceled(), useSynchronizationContext: true))
            {
                this.webBrowser.DocumentCompleted += handler;
                try 
                {           
                    this.webBrowser.Navigate(url);
                    await tcs.Task; // wait for DocumentCompleted
                }
                finally
                {
                    this.webBrowser.DocumentCompleted -= handler;
                }
            }

            var documentElement = this.webBrowser.Document.GetElementsByTagName("html")[0];

            var html = documentElement.OuterHtml;
            while (true)
            {
                await Task.Delay(500, token); 

                if (this.webBrowser.IsBusy)
                    continue; 

                var htmlNow = documentElement.OuterHtml;
                if (html == htmlNow)
                    break; 

                html = htmlNow;
            }

            token.ThrowIfCancellationRequested();
            return html;
        }

        static void SetFeatureBrowserEmulation()
        {
            if (LicenseManager.UsageMode != LicenseUsageMode.Runtime)
                return;
            var appName = System.IO.Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);
            Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION",
                appName, 10000, RegistryValueKind.DWord);
        }
    }
}</code>
로그인 후 복사

이 코드는 HTML 콘텐츠를 검색하기 전에 페이지가 완전히 렌더링되도록 보장하여 더 정확하고 안정적인 결과를 제공합니다.

위 내용은 .NET을 사용하여 HTML 코드를 동적으로 생성하는 접근 방식은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿