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

HTML-документ

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

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

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

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

 1// Initialize an empty HTML Document
 2com.aspose.html.HTMLDocument document = new com.aspose.html.HTMLDocument();
 3try {
 4    // Save the HTML document to a disk
 5    document.save("create-empty-document.html");
 6} finally {
 7    if (document != null) {
 8        document.dispose();
 9    }
10}

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

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

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

 1// Initialize an empty HTML Document
 2com.aspose.html.HTMLDocument document = new com.aspose.html.HTMLDocument();
 3
 4// Prepare an output path for the document saving
 5String documentPath = "create-new-document.html";
 6
 7try {
 8    // Create a text element and add it to the document
 9    Text text = document.createTextNode("How to Create an HTML Document?");
10    document.getBody().appendChild(text);
11
12    // Save the document to a disk
13    document.save(documentPath);
14} finally {
15    if (document != null) {
16        document.dispose();
17    }
18}

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

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

 1// Prepare a 'load-from-file.html' file
 2try (java.io.FileWriter fileWriter = new java.io.FileWriter("load-from-file.html")) {
 3    fileWriter.write("Load HTML from a File!");
 4}
 5
 6// Load from a 'load-from-file.html' file
 7com.aspose.html.HTMLDocument document = new com.aspose.html.HTMLDocument("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
2com.aspose.html.HTMLDocument document = new com.aspose.html.HTMLDocument("https://docs.aspose.com/html/net/creating-a-document/document.html");
3
4// Write the document content to the output stream
5System.out.println(document.getDocumentElement().getOuterHTML());

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

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

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

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

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

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

 1// Create a memory stream object
 2MemoryStream mem = new MemoryStream();
 3StreamWriter sw = new StreamWriter(mem);
 4
 5sw.write("<p>Hello, World! I can load HTML from a stream!</p>");
 6
 7// It is important to set the position to the beginning since HTMLDocument starts the reading exactly from the current position within the stream
 8sw.flush();
 9mem.seek(0, SeekOrigin.Begin);
10
11// Initialize a document from the stream variable
12com.aspose.html.HTMLDocument document = new com.aspose.html.HTMLDocument(mem, ".");
13
14// Save the document to a disk
15document.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
2com.aspose.html.dom.svg.SVGDocument document = new com.aspose.html.dom.svg.SVGDocument("<svg xmlns='http://www.w3.org/2000/svg'><circle cx='60' cy='60' 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// Initialize an AutoResetEvent
 2AutoResetEvent resetEvent = new AutoResetEvent(false);
 3
 4// Create an instance of an HTML document
 5com.aspose.html.HTMLDocument document = new com.aspose.html.HTMLDocument();
 6
 7// Create a string variable for OuterHTML property reading
 8StringBuilder outerHTML = new StringBuilder();
 9
10// Subscribe to 'ReadyStateChange' event
11// This event will be fired during the document loading process
12document.OnReadyStateChange.add(new com.aspose.html.dom.events.DOMEventHandler() {
13    @Override
14    public void invoke(Object sender, com.aspose.html.dom.events.Event e) {
15    // Check the value of the 'ReadyState' property
16    // This property is representing the status of the document. For detail information please visit https://www.w3schools.com/jsref/prop_doc_readystate.asp
17    if (document.getReadyState().equals("complete"))
18    {
19        // Fill the outerHTML variable by value of loaded document
20        outerHTML.append(document.getDocumentElement().getOuterHTML());
21        resetEvent.set();
22    }
23    }
24});
25
26// Wait 5 seconds for the file to load
27if (!resetEvent.waitOne(5000))
28{
29    System.out.println("Thread works too long, more than 5000 ms");
30}
31System.out.println("outerHTML = " + outerHTML);

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

 1AutoResetEvent resetEvent = new AutoResetEvent(false);
 2
 3// Initialize an HTML document
 4com.aspose.html.HTMLDocument document = new com.aspose.html.HTMLDocument();
 5AtomicBoolean isLoading = new AtomicBoolean(false);
 6
 7// Subscribe to the 'OnLoad' event
 8// This event will be fired once the document is fully loaded
 9document.OnLoad.add(new DOMEventHandler() {
10    @Override
11    public void invoke(Object o, Event event) {
12        isLoading.set(true);
13        resetEvent.set();
14    }
15});
16
17// Navigate asynchronously at the specified Uri
18document.navigate("https://docs.aspose.com/html/net/creating-a-document/document.html");
19
20// Here the document is not loaded yet
21
22// Wait 5 seconds for the file to load
23if (!resetEvent.waitOne(5000))
24{
25    System.out.println("Thread works too long, more than 5000 ms");
26}
27
28// Here is the loaded document
29System.out.println("outerHTML = " + document.getDocumentElement().getOuterHTML());

В следующем примере кода Java используется класс HTMLDocumentWaiter в контексте асинхронной работы с документами HTML в библиотеке Aspose.HTML для Java. Класс HTMLDocumentWaiter предоставляет конструкторы и методы, которые выполняют операцию асинхронной загрузки в отдельном потоке и ожидают завершения загрузки или прерывания текущего потока. Посмотрим, что делает код:

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

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

 1package com.aspose.html.examples.java;
 2
 3public class SimpleWait {
 4
 5    public static void main(String... args) {
 6
 7        var html =
 8                new Examples_Java_WorkingWithDocuments_CreatingADocument_HTMLDocumentAsynchronouslyOnLoad();
 9        var htmlDocumentWaiter = new HTMLDocumentWaiter(html);
10        new Thread(htmlDocumentWaiter, "html").start();
11
12    }
13
14}

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

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.