Создать или загрузить HTML-документ в C#

Aspose.HTML for .NET позволяет создавать HTML-документы с нуля, загружать существующий HTML из файла или URL, строить документ из строки или потока в памяти и работать с DOM перед сохранением или конвертацией результата. Центральный API – класс HTMLDocument, который представляет дерево HTML-документа в памяти.

Используйте конструкторы HTMLDocument, чтобы создать или загрузить HTML в C#. Можно начать с пустого документа, открыть HTML-файл или URL, передать HTML-разметку как строку или поток, отредактировать DOM, а затем сохранить или конвертировать документ.

Реализация HTMLDocument основана на спецификациях W3C DOM и WHATWG DOM, поэтому объектная модель использует знакомые браузерные понятия: документ, элементы, текстовые узлы, атрибуты и дочерние узлы. После загрузки документа можно читать HTML, добавлять или удалять узлы, обновлять атрибуты, менять текст, применять стили или передавать документ в сценарий конвертации.

Используйте эту статью, когда нужно выбрать подходящий конструктор или шаблон загрузки для C#-приложения.

Источник или задачаРекомендуемый API
Создать пустой HTML-документnew HTMLDocument()
Построить HTML методами DOMHTMLDocument, CreateTextNode(), AppendChild()
Загрузить HTML-файлnew HTMLDocument(filePath)
Загрузить HTML с URLnew HTMLDocument(url)
Создать HTML из строкиnew HTMLDocument(html, baseUrl)
Создать HTML из потокаnew HTMLDocument(stream, baseUrl)
Создать SVG-документ из разметкиnew SVGDocument(svg, baseUrl)
Загрузить документ без блокировки основного потокаHTMLDocument.Navigate() с событиями OnReadyStateChange или OnLoad

Создание и загрузка HTML-документов

Класс HTMLDocument – отправная точка для большинства сценариев Aspose.HTML for .NET. С его помощью можно создать новый документ, загрузить существующий HTML, изучить DOM, изменить узлы документа и сохранить результат как HTML или конвертировать его в другой формат.

Создать пустой HTML-документ

Используйте конструктор HTMLDocument() по умолчанию, когда нужен пустой документ, который будет заполнен позже.

  1. Создайте экземпляр HTMLDocument с конструктором по умолчанию.
  2. Добавьте узлы, атрибуты или стили, если документ должен содержать пользовательский контент.
  3. Сохраните документ в выходной путь.

Следующий пример создает пустой HTML-документ и сохраняет его в файл:

 1// Create an empty HTML document using C#
 2
 3// Prepare an output path for a document saving
 4string documentPath = Path.Combine(OutputDir, "create-empty-document.html");
 5
 6// Initialize an empty HTML Document
 7using (HTMLDocument document = new HTMLDocument())
 8{
 9    // Work with the document
10
11    // Save the document to a file
12    document.Save(documentPath);
13}

После сохранения выходной файл содержит начальную HTML-структуру, включая элементы <html>, <head> и <body>. Дополнительные параметры сохранения см. в статье Сохранить HTML-документ в C#.

Создать новый HTML-документ с DOM-узлами

Используйте методы DOM, когда HTML-структуру нужно сгенерировать программно.

  1. Создайте пустой HTMLDocument.
  2. Создайте текстовый узел с помощью CreateTextNode().
  3. Добавьте узел в тело документа с помощью AppendChild().
  4. Сохраните сгенерированный HTML-документ.

Следующий пример создает текстовый узел, добавляет его в тело документа и сохраняет новый HTML-файл:

 1// Create an HTML document using C#
 2
 3// Prepare an output path for a document saving
 4string documentPath = Path.Combine(OutputDir, "create-new-document.html");
 5
 6// Initialize an empty HTML Document
 7using (HTMLDocument document = new HTMLDocument())
 8{
 9    // Create a text node and add it to the document
10    Text text = document.CreateTextNode("Hello, World!");
11    document.Body.AppendChild(text);
12
13    // Save the document to a disk
14    document.Save(documentPath);
15}

Другие шаблоны редактирования DOM см. в статье Редактировать HTML-документ в C#.

Загрузить HTML из файла

Используйте конструктор HTMLDocument(string), когда исходный HTML уже существует на диске.

  1. Подготовьте путь к исходному HTML-файлу.
  2. Создайте экземпляр HTMLDocument из этого пути к файлу.
  3. Читайте, изменяйте, сохраняйте или конвертируйте загруженный документ.

Следующий пример загружает HTML-файл и выводит разметку корневого элемента:

 1// Load HTML from a file using C#
 2
 3string htmlFile = Path.Combine(OutputDir, "load-from-file.html");
 4
 5// Prepare a load-from-file.html document
 6File.WriteAllText(htmlFile, "Hello, World!");
 7
 8// Load from the load-from-file.html 
 9using (HTMLDocument document = new HTMLDocument(htmlFile))
10{
11    // Write the document content to the output stream
12    Console.WriteLine(document.DocumentElement.OuterHTML);
13}

Если нужно загрузить существующий HTML-файл, поработать с ним и сохранить новую копию, используйте тот же конструктор и вызовите Save() после применения изменений.

 1// Load an HTML documment from a file using C#
 2
 3// Prepare a file path
 4string documentPath = Path.Combine(DataDir, "sprite.html");
 5
 6// Initialize an HTML document from the file
 7using (HTMLDocument document = new HTMLDocument(documentPath))
 8{
 9    // Work with the document
10
11    // Save the document to a disk
12    document.Save(Path.Combine(OutputDir, "sprite_out.html"));
13}

Загрузить HTML с URL

Используйте загрузку по URL, когда приложению нужно напрямую открыть удаленную HTML-страницу.

  1. Передайте URL страницы в конструктор HTMLDocument.
  2. Позвольте Aspose.HTML загрузить HTML и связанные ресурсы, доступные документу.
  3. Читайте DOM, извлекайте разметку, редактируйте узлы или конвертируйте загруженную страницу.

Следующий пример загружает HTML-документ с URL и выводит полученную разметку в консоль:

Если URL недоступен, Aspose.HTML выбрасывает DOMException с кодом NetworkError.

 1// Load HTML from a URL using C#
 2
 3// Load a document from 'https://docs.aspose.com/html/files/document.html' web page
 4using (HTMLDocument document = new HTMLDocument("https://docs.aspose.com/html/files/document.html"))
 5{
 6    string html = document.DocumentElement.OuterHTML;
 7
 8    // Write the document content to the output stream
 9    Console.WriteLine(html);
10}

Создание документов из HTML-кода

Если HTML-разметка уже доступна в памяти как System.String или System.IO.Stream, не нужно создавать временный исходный файл. Передайте разметку или поток в специализированный конструктор HTMLDocument вместе с базовым URL.

Передавайте корректный baseUrl, если HTML-разметка содержит относительные ссылки на изображения, таблицы стилей, скрипты, шрифты или другие ресурсы. Aspose.HTML использует базовый URL, чтобы разрешать эти ресурсы при загрузке документа.

Создать HTML из строки

Используйте конструктор HTMLDocument(string, string), когда HTML-разметка хранится в C#-строке.

  1. Подготовьте HTML-строку.
  2. Передайте строку и базовый URL в конструктор HTMLDocument.
  3. Сохраните или обработайте созданный документ.

Следующий пример создает HTML-документ из строки и сохраняет его как HTML-файл:

 1// Create HTML from a string using C#
 2
 3// Prepare HTML code
 4string html_code = "<p>Hello, World!</p>";
 5
 6// Initialize a document from the string variable
 7using (HTMLDocument document = new HTMLDocument(html_code, "."))
 8{
 9    // Save the document to a disk
10    document.Save(Path.Combine(OutputDir, "create-from-string.html"));
11}

Создать HTML из потока

Используйте конструктор HTMLDocument(stream, string), когда разметка приходит из памяти, тела ответа, хранилища или другого источника на базе потока.

  1. Запишите или получите HTML-разметку в поток.
  2. Сбросьте позицию потока перед загрузкой, если поток только что был записан.
  3. Передайте поток и базовый URL в конструктор HTMLDocument.
  4. Сохраните, отредактируйте или конвертируйте созданный документ.

Следующий пример создает документ из потока памяти:

 1// Load HTML from a stream using C#
 2
 3// Create a memory stream object
 4using (MemoryStream mem = new MemoryStream())
 5using (StreamWriter sw = new StreamWriter(mem))
 6{
 7    // Write the HTML code into memory object
 8    sw.Write("<p>Hello, World! I love HTML!</p>");
 9
10    // It is important to set the position to the beginning, since HTMLDocument starts the reading exactly from the current position within the stream
11    sw.Flush();
12    mem.Seek(0, SeekOrigin.Begin);
13
14    // Initialize a document from the string variable
15    using (HTMLDocument document = new HTMLDocument(mem, "."))
16    {
17        // Save the document to disk
18        document.Save(Path.Combine(OutputDir, "load-from-stream.html"));
19    }
20}

Создание документов SVG, MHTML и EPUB

Aspose.HTML for .NET также работает с SVG-документами через SVGDocument. SVG- и HTML-документы имеют одну DOM-основу, поэтому многие принципы загрузки, чтения, редактирования и сохранения похожи.

Создать SVG-документ из строки

Используйте SVGDocument(string, string), когда SVG-разметка уже доступна в памяти.

  1. Подготовьте SVG-разметку как строку.
  2. Передайте SVG-строку и базовый URL в SVGDocument.
  3. Читайте, редактируйте, сохраняйте или конвертируйте SVG-документ.

Следующий пример создает SVG-документ с кругом и выводит его разметку в консоль:

1// Load SVG from a string using C#
2
3// Initialize an SVG document from a string object
4using (SVGDocument document = new SVGDocument("<svg xmlns='http://www.w3.org/2000/svg'><circle cx='50' cy='50' r='40'/></svg>", "."))
5{
6    // Write the document content to the output stream
7    Console.WriteLine(document.DocumentElement.OuterHTML);
8}

Больше SVG-сценариев см. в статье Как работать с Aspose.SVG API.

Поддержка MHTML и EPUB

MHTML – формат веб-архива, который может содержать HTML и связанные ресурсы, например CSS, JavaScript, изображения и аудиофайлы. EPUB – формат электронных публикаций, используемый многими eReader-устройствами и приложениями для чтения.

Aspose.HTML for .NET поддерживает MHTML и EPUB в первую очередь для сценариев рендеринга и конвертации. В этой статье эти форматы не рассматриваются как редактируемые источники HTMLDocument. Чтобы конвертировать MHTML или EPUB в PDF, XPS, изображения и другие поддерживаемые выходные форматы, см. Преобразование между форматами в C#.

Асинхронная загрузка HTML

Загрузка документа может занять время, потому что библиотеке нужно загрузить HTML-источник, связанные ресурсы и скрипты. Для отзывчивых приложений можно начать загрузку через Navigate() и обработать завершение через события документа.

Использовать OnReadyStateChange

Используйте OnReadyStateChange, когда нужно проверить, что документ достиг состояния complete.

  1. Создайте пустой HTMLDocument.
  2. Подпишитесь на OnReadyStateChange.
  3. Вызовите Navigate() с целевым URL.
  4. Читайте или обрабатывайте документ после того, как ready state станет complete.

Следующий пример асинхронно загружает удаленный документ и ожидает состояния завершения:

 1// Load HTML asynchronously using C#
 2
 3// Initialize an AutoResetEvent
 4AutoResetEvent resetEvent = new AutoResetEvent(false);
 5
 6// Create an instance of an HTML document
 7HTMLDocument document = new HTMLDocument();
 8
 9// Create a string variable for the OuterHTML property reading
10string outerHTML = string.Empty;
11
12// Subscribe to ReadyStateChange event
13// This event will be fired during the document loading process
14document.OnReadyStateChange += (sender, @event) =>
15{
16    // Check the value of the ReadyState property
17    // This property is representing the status of the document. For detail information please visit https://www.w3schools.com/jsref/prop_doc_readystate.asp
18    if (document.ReadyState == "complete")
19    {
20        // Fill the outerHTML variable by value of loaded document
21        outerHTML = document.DocumentElement.OuterHTML;
22        resetEvent.Set();
23    }
24};
25
26// Navigate asynchronously at the specified Uri
27document.Navigate("https://docs.aspose.com/html/files/document.html");
28
29// Here the outerHTML is empty yet
30
31Console.WriteLine($"outerHTML = {outerHTML}");
32
33//  Wait 5 seconds for the file to load
34
35// Here the outerHTML is filled 
36Console.WriteLine("outerHTML = {0}", outerHTML);

Использовать событие Load

Событие OnLoad – еще один способ отреагировать на завершение асинхронной загрузки документа.

  1. Создайте пустой HTMLDocument.
  2. Подпишитесь на OnLoad.
  3. Вызовите Navigate() с целевым URL.
  4. Продолжайте обработку после вызова события load.

Следующий пример использует событие OnLoad для асинхронной загрузки документа:

 1// Handle an HTML document load using C#
 2
 3// Initialize an AutoResetEvent
 4AutoResetEvent resetEvent = new AutoResetEvent(false);
 5
 6// Initialize an HTML document
 7HTMLDocument document = new HTMLDocument();
 8bool isLoading = false;
 9
10// Subscribe to the OnLoad event
11// This event will be fired once the document is fully loaded
12document.OnLoad += (sender, @event) =>
13{
14    isLoading = true;
15    resetEvent.Set();
16};
17
18// Navigate asynchronously at the specified Uri
19document.Navigate("https://docs.aspose.com/html/files/document.html");
20
21Console.WriteLine("outerHTML = {0}", document.DocumentElement.OuterHTML);

Типичные проблемы при создании документов

ПроблемаПричинаРешение
Относительные изображения, стили или шрифты не загружаютсяДокумент создан из строки или потока без корректного базового URL.Передайте базовый URL, который указывает на папку или адрес, где должны разрешаться относительные ресурсы.
Документ из потока пустойПосле записи разметки позиция потока осталась в конце.Сбросьте позицию потока перед передачей в конструктор HTMLDocument.
Загрузка по URL завершается ошибкой NetworkErrorУдаленный ресурс недоступен или URL не открывается.Проверьте URL, сетевой доступ, редиректы и конфигурацию среды перед загрузкой документа.
Сохраненный HTML содержит только начальную структуруПустой HTMLDocument был сохранен до добавления содержимого.Добавьте DOM-узлы или загрузите исходный HTML перед вызовом Save().
Асинхронный код читает неполную разметкуДокумент проверяется до завершения загрузки.Дождитесь OnReadyStateChange со значением complete или обработайте событие OnLoad перед чтением DOM.
MHTML или EPUB нельзя редактировать как HTMLЭти форматы поддерживаются для сценариев рендеринга, а не как обычные редактируемые источники HTMLDocument.Используйте API конвертации для MHTML и EPUB или сначала переведите контент в редактируемый HTML-сценарий.

FAQ

Как создать пустой HTML-документ в C#?

Создайте HTMLDocument конструктором по умолчанию, добавьте DOM-узлы при необходимости и сохраните документ с помощью Save().

Как загрузить HTML-файл в C#?

Передайте путь к файлу в конструктор HTMLDocument. После загрузки можно читать DOM, обновлять содержимое, сохранять документ или конвертировать его.

Как создать HTML-документ из строки?

Используйте конструктор HTMLDocument(string, string). Первый аргумент – HTML-разметка, второй – базовый URL для разрешения относительных ресурсов.

Зачем нужен базовый URL?

Базовый URL используется для разрешения относительных путей к ресурсам в HTML-строках и потоках. Без него связанные изображения, CSS, скрипты или шрифты могут загрузиться некорректно.

Можно ли загрузить HTML с удаленного URL?

Да. Передайте URL в конструктор HTMLDocument. Если URL недоступен, библиотека сообщит об ошибке сетевой загрузки.

Можно ли создавать SVG-документы с Aspose.HTML for .NET?

Да. Используйте SVGDocument для SVG-содержимого. SVG-документы используют DOM-модель, похожую на HTML, и их можно читать, редактировать, сохранять или конвертировать.

Можно ли создать редактируемые MHTML или EPUB документы таким же способом?

Нет. MHTML и EPUB поддерживаются для сценариев рендеринга и конвертации. Используйте API конвертации, когда нужно отрендерить эти форматы в PDF, XPS, изображения или другие выходные форматы.

Другие платформы

Связанные статьи