Come può produrre una dichiarazione DOCTYPE con l'API di serializzazione di livello DOM 3?

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

  •  05-07-2019
  •  | 
  •  

Domanda

Ho un documento DOM creato da zero e devo serializzarlo su un flusso di output. Sto usando l'API di serializzazione di livello DOM 3, come nell'esempio seguente:

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);

Devo avere all'interno del documento risultante una dichiarazione DOCTYPE con identificatori sia pubblici che di sistema, ma non sono stato in grado di trovare un modo per produrlo.

Come posso fare?

È stato utile?

Soluzione

Puoi creare un nodo DocumentType usando il DOMImplementation .

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));

Risultato:

<?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/>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top