我有以下代码,在根元素之前插入了处理指令:

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


作为输出,我得到:

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


但是我打算在根元素之前有处理指令。我检查了DOM 3可能不正确(请参见下文),但是一切看起来都不错。有什么我想念的吗?任何解决方案都欢迎。

附言我使用Java 1.6.0_27 DOM。如果以上内容似乎是错误,则欢迎提供指向错误报告的链接。

最佳答案

Xerces 2.11.0具有预期的行为,因此它是已修复的错误(但是,找不到错误报告)。

如果必须使用JDK版本,而不必使用LSSerializer,则可以使用身份转换。

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


它将保留节点顺序。

08-07 00:53