Создать 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// Initialize an empty HTML Document.
2HTMLDocument document = new HTMLDocument();
3
4// Save the document to disk.
5document.save($o("create-empty-document.html"));

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

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

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

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

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

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

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

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

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

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

1// Load a document from 'https://docs.aspose.com/html/net/creating-a-document/document.html' web page
2HTMLDocument document = new HTMLDocument("https://docs.aspose.com/html/net/creating-a-document/document.html");
3
4System.out.println(document.getDocumentElement().getOuterHTML());

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

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

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

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

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

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

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

SVG-документ

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

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

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

1// Initialize an SVG document from a string object
2SVGDocument document = new SVGDocument("<svg xmlns='http://www.w3.org/2000/svg'><circle cx='50' cy='50' r='40'/></svg>", ".");
3
4// Write the document content to the output stream
5System.out.println(document.getDocumentElement().getOuterHTML());

MHTML-документ

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

EPUB-документ

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

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

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

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

ReadyStateChange – не единственное событие, которое может использоваться для обработки операции асинхронной загрузки, вы также можете подписаться на событие Load следующим образом:

 1// Create the instance of HTML Document
 2HTMLDocument document = new HTMLDocument();
 3
 4// Subscribe to the 'ReadyStateChange' event.
 5// 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 в контексте асинхронной работы с документами HTML в библиотеке Aspose.HTML for Java. Класс HTMLDocumentWaiter предоставляет конструкторы и методы, которые выполняют операцию асинхронной загрузки в отдельном потоке и ожидают завершения загрузки или прерывания текущего потока. Посмотрим, что делает код:

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

Следующий фрагмент кода описывает класс SimpleWait, который содержит метод main(), служащий точкой входа для приложения Java. Внутри метода main() создается экземпляр html класса Examples_Java_WorkingWithDocuments_CreatingADocument_HTMLDocumentAsynchronouslyOnLoad. Он отвечает за асинхронную загрузку HTML-документа и создает объект HTMLDocumentWaiter для ожидания завершения загрузки. Наконец, он запускает новый поток для выполнения ожидающего процесса:

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

Заключение

  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.