В моем приложении я изменяю некоторую часть файлов XML, которая начинается следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Id: version control yadda-yadda $ -->
<myElement>
...
Обратите внимание на пустую строку перед <myElement>
. После загрузки, изменения и сохранения результат далеко не радует:
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Id: version control yadda-yadda $ --><myElement>
...
Я обнаружил, что пробел (одна новая строка) между комментарием и узлом документа вообще не представлен в DOM. Следующий автономный код надежно воспроизводит проблему:
String source =
"<?xml version=\"1.0\" encoding=\"UTF-16\"?>\n<!-- foo -->\n<empty/>";
byte[] sourceBytes = source.getBytes("UTF-16");
DocumentBuilder builder =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc =
builder.parse(new ByteInputStream(sourceBytes, sourceBytes.length));
DOMImplementationLS domImplementation =
(DOMImplementationLS) doc.getImplementation();
LSSerializer lsSerializer = domImplementation.createLSSerializer();
System.out.println(lsSerializer.writeToString(doc));
// output: <?xml version="1.0" encoding="UTF-16"?>\n<!-- foo --><empty/>
У кого-нибудь есть идеи, как этого избежать? По сути, я хочу, чтобы вывод был таким же, как ввод. (Я знаю, что объявление xml будет сгенерировано заново, поскольку оно не является частью DOM, но здесь это не проблема.)