Crear documento HTML – crear y cargar HTML en Java
Documento HTML
La clase HTMLDocument es un punto de partida para la biblioteca de clases Aspose.HTML for Java, que permite a los desarrolladores trabajar con contenido HTML mediante programación. La clase HTMLDocument representa una página HTML representada en un navegador y sirve como raíz del Modelo de objetos de documento (DOM).
Algunas características de HTMLDocument
- Los constructores flexibles admiten la creación de un documento HTML a partir de un archivo, URL, secuencia o cadena.
- HTMLDocument proporciona una representación en memoria que garantiza la estructura DOM completa para la manipulación.
- El manejo de eventos incluye soporte para eventos DOM para operaciones asincrónicas.
El HTMLDocument proporciona una representación en memoria de un DOM HTML y se basa completamente en las especificaciones W3C DOM y WHATWG DOM compatibles con muchos navegadores modernos. Si está familiarizado con los estándares WHATWG DOM, WHATWG HTML y JavaScript, le resultará bastante cómodo utilizar Aspose.HTML for Java. De lo contrario, puedes visitar www.w3schools.com, donde puedes encontrar muchos ejemplos y tutoriales sobre cómo trabajar con documentos HTML.
Crear un documento HTML vacío
El siguiente fragmento de código muestra el uso del constructor predeterminado HTMLDocument()
para crear un documento HTML vacío y guardarlo en un archivo.
1// Initialize an empty HTML Document.
2HTMLDocument document = new HTMLDocument();
3
4// Save the document to disk.
5document.save($o("create-empty-document.html"));
Después de la creación, aparece el archivo create-empty-document.html con la estructura del documento inicial: el documento vacío incluye elementos como <html>
<head>
y <body>
. Más detalles sobre cómo guardar archivos HTML se encuentran en el artículo
Guardar documento HTML.
Estructura de archivo resultante:
1<html>
2 <head></head>
3 <body></body>
4</html>
Crear un nuevo documento HTML
Para generar un documento mediante programación desde cero, utilice el constructor HTMLDocument()
sin parámetros, como se muestra en el fragmento de código anterior. Una vez creado el objeto del documento, se puede completar posteriormente con elementos HTML. Puede completar el documento con contenido, como crear un nodo de texto y agregarlo al cuerpo del documento:
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"));
Cargar HTML desde un archivo
El siguiente fragmento de código muestra cómo cargar el HTMLDocument desde un archivo existente:
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());
Cargar HTML desde una URL
La clase HTMLDocument puede buscar y cargar contenido HTML desde una página web. En el siguiente fragmento de código puede ver cómo cargar una página web en HTMLDocument.
En caso de que pase una URL incorrecta a la que no se pueda acceder en este momento, la biblioteca genera la
DOMException con el código especializado NetworkError
para informarle que no se puede encontrar el recurso seleccionado.
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());
Cargar HTML desde código HTML
Si prepara un código HTML como objetos en memoria Class String o Class InputStream, no necesita guardarlos en el archivo, simplemente pase su código HTML a constructores especializados. Para crear un documento a partir de una cadena, utilice el constructor HTMLDocument(content, baseUri) con el contenido HTML y un baseUri:
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"));
En caso de que su código HTML tenga los recursos vinculados (estilos, scripts, imágenes, etc.), debe pasar un parámetro baseUrl válido al constructor del documento. Se utilizará para resolver la ubicación del recurso durante la carga del documento.
Cargar HTML desde una secuencia
Para crear un documento HTML a partir de una secuencia, puede utilizar el constructor 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");
Trabajar con documentos SVG, MHTML y EPUB
Documento SVG
Dado que los gráficos vectoriales escalables (SVG) son parte de los estándares W3C y podrían integrarse en HTMLDocument, implementamos SVGDocument y toda su funcionalidad. Nuestra implementación se basa en la especificación oficial especificación SVG2, por lo que puede cargar, leer y manipular documentos SVG como se describe oficialmente.
Dado que
SVGDocument y
HTMLDocument se basan en el mismo estándar
WHATWG DOM, todas las operaciones como cargar, leer, editar, convertir y guardar son similares para ambos documentos. Por lo tanto, todos los ejemplos en los que puede ver manipulación con HTMLDocument
también son aplicables para SVGDocument
.
El siguiente ejemplo le muestra cómo cargar el documento SVG desde la variable en memoria 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());
Documento MHTML
MHTML (encapsulación MIME de documentos HTML agregados) es un formato especializado para crear archivos de páginas web. La biblioteca Aspose.HTML for Java admite MHTML, pero su funcionalidad actualmente se limita a convertir y representar operaciones de MHTML a otros formatos de salida compatibles. Para obtener más información, consulte el artículo Conversión entre formatos.
Documento EPUB
EPUB, un formato de publicación electrónica ampliamente utilizado para libros electrónicos, tiene limitaciones similares en la biblioteca Aspose.HTML for Java que MHTML. La biblioteca solo admite operaciones de renderizado desde EPUB a formatos de salida compatibles. Para obtener detalles adicionales, visite el artículo Conversión entre formatos.
Operaciones asincrónicas
Nos damos cuenta de que cargar un documento puede ser una operación que consume muchos recursos, ya que es necesario cargar no solo el documento en sí, sino también todos los recursos vinculados y procesar todos los scripts. Entonces, en los siguientes fragmentos de código, le mostramos cómo usar operaciones asincrónicas y cargar HTMLDocument sin bloquear el hilo principal:
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 no es el único evento que se puede usar para manejar una operación de carga asíncrona; también puedes suscribirte al evento Load, como se muestra a continuación:
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}
El siguiente ejemplo de código Java utiliza la clase HTMLDocumentWaiter
en el contexto de trabajar con documentos HTML de forma asincrónica en la biblioteca Aspose.HTML for Java. La clase HTMLDocumentWaiter
proporciona constructores y métodos que ejecutan la operación de carga asincrónica en un hilo separado y espera hasta que finalice la carga o se interrumpa el hilo actual. Veamos qué hace el código:
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}
El siguiente fragmento de código describe la clase SimpleWait
, que contiene el método main()
que sirve como punto de entrada para una aplicación Java. Dentro del método main()
, se crea una instancia html
de la clase Examples_Java_WorkingWithDocuments_CreatingADocument_HTMLDocumentAsynchronouslyOnLoad
. Es responsable de cargar el documento HTML de forma asincrónica y crea un objeto HTMLDocumentWaiter para esperar a que se complete la carga. Finalmente, inicia un nuevo hilo para ejecutar el proceso de espera:
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");
Conclusiones
Manipulación DOM integral: la clase
HTMLDocument
proporciona una forma sólida y compatible con los estándares de crear, modificar y manipular documentos HTML mediante programación, siguiendo las especificaciones W3C y WHATWG.Creación y carga de documentos flexibles: mediante constructores, los desarrolladores pueden crear documentos desde cero, cargar HTML desde una variedad de fuentes (archivos, URL, secuencias) o generar contenido dinámicamente.
Soporte de operaciones avanzadas: características como la carga asincrónica y el manejo de eventos permiten una integración perfecta de operaciones que consumen muchos recursos sin bloquear el hilo principal de la aplicación.
Compatibilidad entre formatos: la biblioteca extiende algunas funciones HTML a otros formatos de documentos como SVG, MHTML y EPUB, ofreciendo un enfoque unificado para manejar contenido web diverso.
Puede descargar los ejemplos completos y los archivos de datos desde GitHub.