В LSSerializer отсутствует атрибут xmlns при сериализации XML-документа в jdk 11 (отлично работает в jdk 8) - PullRequest
0 голосов
/ 25 февраля 2019

Я использую LSSerializer, `связанный ниже ', для сериализации XML-документов в моем приложении, и теперь, когда я перехожу с Java на 8-11, я увидел, что в сериализованных XML-документах отсутствует атрибут пространства имен xml по умолчанию (" xmlns "),Кажется, реализация LSSerializer, используемая в jdk 8, была заменена на jdk 9 и далее.И новая реализация пропускает атрибут xmlns при сериализации документа DOM (ошибка?)

Чтобы проиллюстрировать эту проблему, следующий код при компиляции и запуске в Java 11 пропускает атрибут xmlns в xml (он отлично работает сJava 8)

import org.w3c.dom.*;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSSerializer;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.InputStream;
import java.io.ByteArrayInputStream;
import java.io.*;


public class Test {
    public static void main(String[] args) {
        String xml = "<bio><body xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:xfa=\"http://www.xfa.org/schema/xfa-data/1.0/\"><p>test</p></body></bio>";
        try {
            InputStream inputStream = new ByteArrayInputStream(xml.getBytes("UTF-8"));

            DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
            Document doc = builder.parse(inputStream);
            Element node = doc.getDocumentElement();

            DOMImplementationLS domImplementation = (DOMImplementationLS)doc.getImplementation();
            LSSerializer lsSerializer = domImplementation.createLSSerializer();
            String output = lsSerializer.writeToString(node);
            System.out.println(output);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Вывод в java8:

<?xml version="1.0" encoding="UTF-16"?>
<bio><body xmlns="http://www.w3.org/1999/xhtml" xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/"><p>test</p></body></bio>

Вывод в java11:

<?xml version="1.0" encoding="UTF-16"?><bio><body xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/"><p>test</p></body></bio>

Я проверил это, изменив различные свойства конфигурации DOM link below объекта LSSerializer, такого как "декларации пространства имен", "discard-default-content" и т. д., но во всех случаях отсутствует атрибут xmlns.

LSSerialize

изменение различных свойств конфигурации DOM

...