При создании org.w3c.dom.Document сущности символов HTML удаляются
У меня есть служебный класс Java XML. buildDocument()
метод принимает строку XML и возвращает org.w3c.dom.Document
, Конкретный XML, который я передаю, - это документ xhtml 1.1.
Проблема в том, если есть HTML-объекты с именами, например,
<p>Preserve dagger †</p>
выход есть,
<p>Preserve dagger </p>
Это сохраняет <
, >
, &
, "
,
Вот класс создания 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>
Любые идеи о том, как сохранить эти объекты? Спасибо
1 ответ
Мне потребовалось некоторое время, чтобы найти решение этой проблемы, по-видимому, трудно найти правильные ключевые слова..., так как я нашел это, прежде чем нашел лучший ответ, я подумал, что стоит связать его здесь, даже если он включен Stackru в любом случае. Вот и все: сохраняйте числовые символьные символы, такие как `& # 10; & # 13; `при разборе XML в Java
Это не совсем удовлетворительно, но, по крайней мере, очень хорошо объясняет, почему нет лучшего решения.