Сущности символов HTML удалены при построении org.w3c.dom.Document

У меня есть служебный класс Java XML. Метод buildDocument() принимает строку XML и возвращает org.w3c.dom.Document. Конкретный XML, который я ему передаю, представляет собой документ xhtml 1.1.

Проблема в том, что если есть объекты с именами HTML, например,

<p>Preserve dagger &dagger;</p>

выход есть,

<p>Preserve dagger </p>

Он сохраняет &lt;, &gt;, &amp;, &quot;.

Вот класс, создающий Document.

package com.example;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

public final class XMLUtils {

    private XMLUtils() {
    }

    public static Document buildDocument(String xml) throws ParserConfigurationException, SAXException, IOException {

        DocumentBuilderFactory domFactory = DocumentBuilderFactory
            .newInstance();
        domFactory.setNamespaceAware(true);

        domFactory.setFeature("http://xml.org/sax/features/validation", false);
        domFactory.setFeature(
            "http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
        domFactory.setFeature(
            "http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
        domFactory.setCoalescing(false);
        DocumentBuilder builder = domFactory.newDocumentBuilder();

        Document doc = builder.parse(new ByteArrayInputStream(
                xml.getBytes(StandardCharsets.UTF_8)));

        try {
            DOMSource domSource = new DOMSource(doc);
            StringWriter writer = new StringWriter();
            StreamResult result = new StreamResult(writer);
            TransformerFactory tf = TransformerFactory.newInstance();
            Transformer transformer = tf.newTransformer();
            transformer.transform(domSource, result);
            System.out.println("XML OUT: \n" + writer.toString());
        } catch (Exception ex) {

        }

        return doc;
    }
}

Я думаю, что это соответствующие зависимости.

<dependency>
    <groupId>net.sf.saxon</groupId>
    <artifactId>Saxon-HE</artifactId>
    <version>9.5.1-6</version>
</dependency>
<dependency>
    <groupId>xerces</groupId>
    <artifactId>xercesImpl</artifactId>
    <version>2.11.0</version>
    <type>jar</type>
</dependency>
<dependency>
    <groupId>xml-resolver</groupId>
    <artifactId>xml-resolver</artifactId>
    <version>1.2</version>
    <type>jar</type>
</dependency>

Любые идеи о том, как сохранить эти сущности? Спасибо, /в


person wsams    schedule 19.02.2015    source источник


Ответы (1)


Мне потребовалось некоторое время, чтобы найти решение этой проблемы, видимо, сложно найти правильные ключевые слова... так как я нашел это прежде, чем найти лучший ответ, я подумал, что стоит связать его здесь, даже если он в любом случае находится на StackOverflow. Итак: Сохранить числовой символьный объект символы, такие как ` `, при разборе XML в Java

Это не совсем удовлетворительно, но, по крайней мере, очень хорошо объясняет, почему нет лучшего решения.

person Francesco Marchetti-Stasi    schedule 19.06.2015