В LSSerializer отсутствует атрибут xmlns при сериализации XML-документа в jdk 11 (отлично работает в jdk 8)

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

Чтобы проиллюстрировать проблему, следующий код при компиляции и запуске в Java 11 пропускает атрибут xml ns в 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, такого как "namespace-декларации", "discard-default-content" и т. д., но во всех случаях отсутствует атрибут xml ns.

LSSerialize

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

0 ответов

Я столкнулся с той же проблемой. Я исправил это, установив для namespaceAware значение true, которое по умолчанию является ложным.

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
Другие вопросы по тегам