Сериализация инструкции обработки XML перед корневым элементом - PullRequest
0 голосов
/ 02 ноября 2011

У меня есть следующий код, который вставляет инструкции обработки перед корневым элементом:

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 неверен (см. Ниже), но все выглядит хорошо.Я что-то пропустил?Любое решение приветствуется.

PS Я использую Java 1.6.0_27 DOM.Если приведенное выше выглядит как ошибка, ссылки на отчеты об ошибках приветствуются.

enter image description here

1 Ответ

2 голосов
/ 02 ноября 2011

Xerces 2.11.0 имеет ожидаемое поведение, поэтому это исправленная ошибка (однако не удалось найти отчет об ошибке).

Если вам нужно использовать версию JDK, вместо использования LSSerializer вы можете использовать преобразование идентичности.

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

Это сохранит порядок узлов.

...