我有以下代码,它在根元素之前插入处理指令:
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三个可能不正确(见下文),但一切看起来还不错。有什么我错过的吗?欢迎任何解决方案。
P.S。我使用Java 1.6.0_27 DOM。如果上面看起来像一个错误,欢迎链接到错误报告。
答案 0 :(得分:2)
Xerces 2.11.0具有预期的行为,因此它是一个已修复的错误(但无法找到错误报告)。
如果必须使用JDK版本,而不是使用LSSerializer,则可以使用身份转换。
Transformer t = TransformerFactory.newInstance().newTransformer();
t.transform(new DOMSource(doc), new StreamResult(fos);
它将保留节点顺序。