В 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.
0 ответов
Я столкнулся с той же проблемой. Я исправил это, установив для namespaceAware значение true, которое по умолчанию является ложным.
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);