2009-09-11 42 views
8

我有一個從頭開始創建的DOM文檔,我需要將它序列化爲輸出流。我使用DOM Level 3的序列化API,如下面的例子:如何使用DOM級別3序列化API生成DOCTYPE聲明?

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聲明與公共和系統標識符裏面,但我沒能找到一種方法,生產它。

我該怎麼辦?

回答

13

您可以使用DOMImplementation創建一個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/> 
+0

如何更改編碼設置爲UTF-8? – 2015-02-23 13:59:17

+1

@VishnuPrasadKallummel請參閱[本答案](http:/以下)中[LSOutput](http://docs.oracle.com/javase/8/docs/api/org/w3c/dom/ls/LSOutput.html)的使用。 /stackoverflow.com/a/28546725/304)。 – McDowell 2015-02-23 16:08:44