Как можно создать объявление DOCTYPE с помощью DOM level 3 serialization API?

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

  •  05-07-2019
  •  | 
  •  

Вопрос

У меня есть документ DOM, созданный с нуля, и мне нужно сериализовать его в выходной поток.Я использую API сериализации DOM уровня 3, как в следующем примере:

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

Мне нужно иметь внутри результирующего документа объявление DOCTYPE как с общедоступными, так и с системными идентификаторами, но я не смог найти способ его создания.

Как я могу это сделать?

Это было полезно?

Решение

Вы можете создать DocumentType узел, использующий Доминирующая реализация.

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

Результат:

<?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/>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top