¿Cómo se puede producir una declaración DOCTYPE con la API de serialización DOM nivel 3?

StackOverflow https://stackoverflow.com/questions/1409708

  •  05-07-2019
  •  | 
  •  

Pregunta

Tengo un documento DOM creado desde cero y necesito serializarlo a una secuencia de salida. Estoy usando la API de serialización DOM nivel 3, como en el siguiente ejemplo:

OutputStream out; 
Document doc;

DOMImplementationLS domImplementation = 
    (DOMImplementationLS) DocumentBuilderFactory.newInstance().newDocumentBuilder().getDOMImplementation();
LSSerializer lsSerializer = domImplementation.createLSSerializer();
LSOutput lsOutput = domImplementation.createLSOutput();
lsOutput.setByteStream(out);
lsSerializer.write(doc, lsOutput);

Necesito tener dentro del documento resultante una declaración DOCTYPE con identificadores tanto públicos como del sistema, pero no pude encontrar una manera de producirla.

¿Cómo puedo hacer?

¿Fue útil?

Solución

Puede crear un nodo DocumentType utilizando Implementación de DOM .

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbf.newDocumentBuilder();
// create doc
Document doc = docBuilder.newDocument();
DOMImplementation domImpl = doc.getImplementation();
DocumentType doctype = domImpl.createDocumentType("web-app",
    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN",
    "http://java.sun.com/dtd/web-app_2_3.dtd");
doc.appendChild(doctype);
doc.appendChild(doc.createElement("web-app"));
// emit
System.out.println(((DOMImplementationLS) domImpl).createLSSerializer()
    .writeToString(doc));

Resultado:

<?xml version="1.0" encoding="UTF-16"?>
<!DOCTYPE web-app
  PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
         "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app/>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top