2011-11-02 80 views
0

我有下面的代碼,即插入根元素之前的處理操作的指令:序列化XML處理指令

Document doc = builder.parse(file); 

doc.insertBefore(
      doc.createProcessingInstruction("xml-stylesheet", "type=\"text/xsl\" href=\"annotation.xsl\""), 
      doc.getDocumentElement()); 
doc.insertBefore(doc.createProcessingInstruction("oxygen", "NVDLSchema=\"annotation.nvdl\""), 
      doc.getDocumentElement()); 

和我使用它來序列化:

FileOutputStream fos = new FileOutputStream(new File(file.getAbsolutePath() + ".out")); 
DOMImplementationLS ls = (DOMImplementationLS) builder.getDOMImplementation(); 

LSOutput lso = ls.createLSOutput(); 
lso.setByteStream(fos); 
ls.createLSSerializer().write(doc, lso); 

fos.close(); 

作爲輸出I得到:

<?xml version="1.0" encoding="UTF-8"?> 
<fulltext-document>...</fulltext-document><?xml-stylesheet type="text/xsl" href="annotation.xsl"?><?oxygen NVDLSchema="annotation.nvdl"?> 

但是我打算有處理指令之前根元素。我檢查了可能是DOM三不正確(見下文),但一切看起來都不錯。有什麼我錯過了嗎?歡迎任何解決方案。

P.S.我使用Java 1.6.0_27 DOM。如果上面看起來像一個錯誤,歡迎鏈接到錯誤報告。

enter image description here

回答

2

的Xerces 2.11.0有預期的行爲,所以它是修正了一個錯誤(找不到錯誤報告,雖然)。

如果您必須使用JDK版本,而不是使用LSSerializer,則可以使用標識轉換。

Transformer t = TransformerFactory.newInstance().newTransformer(); 
    t.transform(new DOMSource(doc), new StreamResult(fos); 

它將保留節點順序。

+0

謝謝你的優雅的解決方案。 –