Создать HTML-документ – Create or Load HTML in Java

HTML-документ

HTMLDocument является отправной точкой для библиотеки классов Aspose.HTML for Java. Вы можете загрузить HTML-страницу в объектную модель документа (DOM) ​​с помощью класса HTMLDocument, а затем программным способом прочитать, изменить или удалить HTML-код в документе. Класс HTMLDocument имеет несколько перегруженных конструкторов, позволяющих создавать пустой документ или загружать HTML из файла, URL-адреса или потока.

HTMLDocument обеспечивает представление HTML DOM в памяти и полностью основан на спецификациях W3C DOM и WHATWG DOM, поддерживаемых многими современными браузерами. Если вы знакомы со стандартами WHATWG DOM, WHATWG HTML и JavaScript, вам будет очень удобно использовать библиотеку Aspose.HTML for Java. В противном случае вы можете посетить www.w3schools.com, где вы найдете множество примеров и руководств по работе с HTML-документами.

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

После создания объекта документа его можно позже заполнить элементами HTML. В следующем фрагменте кода показано использование конструктора HTMLDocument() по умолчанию для создания пустого HTML-документа и сохранения его в файл.

1// Create an empty HTML document using Java
2
3// Initialize an empty HTML Document
4HTMLDocument document = new HTMLDocument();
5
6// Save the document to disk
7document.save("create-empty-document.html");

После создания появляется файл create-empty-document.html с исходной структурой документа: пустой документ включает такие элементы, как <html>, <head> и <body>. Подробнее о сохранении HTML-файлов читайте в статье Сохранить HTML-документ.

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

Если вы хотите сгенерировать документ программно с нуля, используйте конструктор HTMLDocument() без параметров, как показано во фрагменте кода выше. Затем вы можете заполнить документ содержимым, например создать текстовый узел и добавить его в тело документа:

 1// Create an HTML document using Java
 2
 3// Initialize an empty HTML document
 4HTMLDocument document = new HTMLDocument();
 5
 6// Create a text node and add it to the document
 7Text text = document.createTextNode("Hello, World!");
 8document.getBody().appendChild(text);
 9
10// Save the document to disk
11document.save("create-new-document.html");

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

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

 1// Load HTML from a file using Java
 2
 3// Prepare the "load-from-file.html" file
 4try (java.io.FileWriter fileWriter = new java.io.FileWriter("load-from-file.html")) {
 5    fileWriter.write("Hello, World!");
 6}
 7
 8// Load HTML from the file
 9HTMLDocument document = new HTMLDocument("load-from-file.html");
10
11// Write the document content to the output stream
12System.out.println(document.getDocumentElement().getOuterHTML());

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

В следующем фрагменте кода показано, как загрузить веб-страницу в HTMLDocument.

В случае, если вы передаете неправильный URL-адрес, который недоступен в данный момент, библиотека выдает DOMException со специальным кодом ‘NetworkError’, чтобы сообщить вам, что выбранный ресурс не может быть найден.

1// Load HTML from a URL using Java
2
3// Load a document from https://docs.aspose.com/html/files/document.html web page
4HTMLDocument document = new HTMLDocument("https://docs.aspose.com/html/files/document.html");
5
6System.out.println(document.getDocumentElement().getOuterHTML());

Загрузить HTML из HTML-кода

Если вы подготавливаете код HTML в виде объектов Class String или Class InputStream в памяти, вам не нужно сохранять их в файл, просто передайте код HTML в специализированный конструктор, например, HTMLDocument(content, baseUri). Следующий фрагмент кода Java демонстрирует, как создать документ HTML с помощью библиотеки Aspose.HTML for Java с нуля и сохранить его в файл:

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

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

Загрузить HTML из потока

Чтобы создать HTML-документ из потока, вы можете использовать конструктор HTMLDocument(stream, string):

 1// Load HTML from a stream using Java
 2
 3// Create a memory stream object
 4String code = "<p>Hello, World! I love HTML!</p>";
 5java.io.InputStream inputStream = new java.io.ByteArrayInputStream(code.getBytes());
 6
 7// Initialize a document from the stream variable
 8HTMLDocument document = new HTMLDocument(inputStream, ".");
 9
10// Save the document to disk
11document.save("load-from-stream.html");

SVG-документ

Поскольку масштабируемая векторная графика (SVG) является частью стандартов W3C и может быть встроена в HTMLDocument, мы реализовали SVGDocument и все его функции. Наша реализация основана на официальной спецификации SVG 2, поэтому вы можете загружать, читать и манипулировать документами SVG так, как это официально описано.

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

В приведенном ниже примере показано, как загрузить документ SVG из переменной Class String в памяти:

1// Load SVG from a string using Java
2
3// Initialize an SVG document from a string object
4SVGDocument 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
7System.out.println(document.getDocumentElement().getOuterHTML());

MHTML-документ

MHTML расшифровывается как MIME-инкапсуляция совокупных HTML-документов. Это специальный формат для создания архивов веб-страниц. Библиотека Aspose.HTML поддерживает этот формат, но с некоторыми ограничениями. Мы поддерживаем только операции рендеринга из MHTML в поддерживаемые выходные форматы. Для получения более подробной информации, пожалуйста, прочитайте статью Преобразование между форматами.

EPUB-документ

Для формата EPUB, представляющего формат электронной публикации, действуют те же ограничения, что и для MHTML. Мы поддерживаем только операции рендеринга из EPUB в поддерживаемые выходные форматы. Для получения более подробной информации, пожалуйста, прочитайте статью Преобразование между форматами.

Асинхронные операции

Мы понимаем, что загрузка документа может быть ресурсоемкой операцией, поскольку требуется загрузка не только самого документа, но и всех связанных ресурсов и обработки всех скриптов. Итак, в следующих фрагментах кода мы покажем вам, как использовать асинхронные операции и загружать HTMLDocument без блокировки основного потока.

Следующий код демонстрирует работу с HTMLDocument в Java, подписываясь на событие OnReadyStateChange, которое отслеживает процесс загрузки документа. Когда документ достигает состояния “complete”, он извлекает полную HTML-разметку корневого элемента документа с помощью метода getOuterHTML() и сохраняет её в StringBuilder. Чтобы обеспечить достаточное время для загрузки документа и возможность выполнения обработчика событий, программа приостанавливает выполнение на 5 секунд с помощью Thread.sleep(5000). Затем она выводит захваченный HTML-код на консоль.

 1// Load HTML asynchronously using Java
 2
 3// Create an instance of the HTMLDocument class
 4HTMLDocument document = new HTMLDocument();
 5
 6// Create a string variable for OuterHTML property reading
 7StringBuilder outerHTML = new StringBuilder();
 8
 9// Subscribe to 'ReadyStateChange' event
10// This event will be fired during the document loading process
11document.OnReadyStateChange.add(new DOMEventHandler() {
12    @Override
13    public void invoke(Object sender, Event e) {
14        // Check the value of the 'ReadyState' property
15        // This property is representing the status of the document. For detail information please visit https://www.w3schools.com/jsref/prop_doc_readystate.asp
16        if (document.getReadyState().equals("complete")) {
17            // Fill the outerHTML variable by value of loaded document
18            outerHTML.append(document.getDocumentElement().getOuterHTML());
19        }
20    }
21});
22
23Thread.sleep(5000);
24
25System.out.println("outerHTML = " + outerHTML);

В отличие от первого примера, следующий демонстрирует асинхронную навигацию путем загрузки документа с заданного URL-адреса с использованием wait/notify вместо фиксированной задержки. Этот подход более надежен, поскольку он точно реагирует на достижение документом состояния “complete”, избегая ненужного ожидания или преждевременного выполнения.

 1// Create an instance of the HTMLDocument class
 2
 3HTMLDocument document = new HTMLDocument();
 4
 5// Subscribe to the 'ReadyStateChange' event. This event will be fired during the document loading process
 6document.OnReadyStateChange.add(new DOMEventHandler() {
 7    @Override
 8    public void invoke(Object sender, Event e) {
 9        // Check the value of 'ReadyState' property
10        // This property is representing the status of the document. For detail information please visit https://www.w3schools.com/jsref/prop_doc_readystate.asp
11        if (document.getReadyState().equals("complete")) {
12            System.out.println(document.getDocumentElement().getOuterHTML());
13            notifyAll();
14        }
15    }
16});
17
18// Navigate asynchronously at the specified Uri
19document.navigate("https://html.spec.whatwg.org/multipage/introduction.html");
20
21synchronized (this) {
22    wait(10000);
23}

В этом примере Java определяется пользовательский класс HTMLDocumentWaiter, реализующий интерфейс Runnable для асинхронной работы с HTML-документами с использованием библиотеки Aspose.HTML for Java. Конструктор принимает экземпляр HTMLDocumentAsynchronouslyOnLoad и запускает его выполнение в отдельном потоке. В методе run() код непрерывно проверяет, получено ли сообщение от асинхронной операции, приостанавливая поток на заданный интервал Thread.sleep(60000) между проверками. Как только сообщение становится доступным или поток прерывается, ожидающий останавливается. Такой подход позволяет отслеживать процесс асинхронной загрузки параллельно с основным потоком программы.

 1// Create async waiter thread for HTML document loading using Java
 2
 3public class HTMLDocumentWaiter implements Runnable {
 4
 5    private final HTMLDocumentAsynchronouslyOnLoad html;
 6
 7    public HTMLDocumentWaiter(HTMLDocumentAsynchronouslyOnLoad html) throws Exception {
 8        this.html = html;
 9        this.html.execute();
10    }
11
12    @Override
13    public void run() {
14        System.out.println("Current Thread: " + Thread.currentThread().getName() + "; " + Thread.currentThread().getId());
15
16        while (!Thread.currentThread().isInterrupted() && html.getMsg() == null) {
17            try {
18                Thread.sleep(60000);
19            } catch (InterruptedException e) {
20                throw new RuntimeException(e);
21            }
22        }
23        Thread.currentThread().interrupt();
24    }
25}

В следующем примере код использует событие OnLoad вместо проверки ReadyState или ручного ожидания. Событие OnLoad автоматически срабатывает после завершения загрузки документа, что делает этот подход проще и эффективнее. При срабатывании события программа извлекает внешний HTML-код документа и выводит его на консоль. Этот метод позволяет избежать ненужных задержек и проблем с синхронизацией, обеспечивая более понятный способ работы с асинхронно загружаемым HTML-контентом.

 1// Handle HTML document onLoad event when navigating to URL using Java
 2
 3// Create an instance of the HTMLDocument class
 4HTMLDocument document = new HTMLDocument();
 5
 6// Subscribe to the 'OnLoad' event. This event will be fired once the document is fully loaded
 7document.OnLoad.add(new DOMEventHandler() {
 8    @Override
 9    public void invoke(Object sender, Event e) {
10        msg = document.getDocumentElement().getOuterHTML();
11        System.out.println(msg);
12    }
13});
14
15// Navigate asynchronously at the specified Uri
16document.navigate("https://html.spec.whatwg.org/multipage/introduction.html");

Заключение

  1. Комплексное манипулирование DOM: класс HTMLDocument предоставляет надежный и соответствующий стандартам способ создания, изменения и манипулирования HTML-документами программным способом в соответствии со спецификациями W3C и WHATWG.
  2. Гибкое создание и загрузка документов: с помощью конструкторов разработчики могут создавать документы с нуля, загружать HTML из различных источников (файлов, URL-адресов, потоков) или динамически генерировать контент.
  3. Поддержка расширенных операций: такие функции, как асинхронная загрузка и обработка событий, обеспечивают бесшовную интеграцию ресурсоемких операций без блокировки основного потока приложения.
  4. Работа с форматами SVG, MHTML и EPUB: библиотека расширяет некоторые функциональные возможности HTML на другие форматы документов, такие как SVG, MHTML и EPUB, предлагая единый подход к обработке разнообразного веб-контента.

Вы можете скачать полные примеры и файлы данных по адресу GitHub.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.