Я использую 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