使用javax.xml.transform.Transformer中的原始文本

时间:2015-12-02 18:11:33

标签: java xml

在处理XML文档时,我使用已包含XML实体的字符串,并希望它们按原样插入。但是,这恰好发生了:

String s = "This — That";
....
document.appendChild(document.createTextNode(s));
....
transformer.transform(new DOMSource(document), new StreamResult(stringWriter));

System.out.println(stringWriter.toString()); // outputs "This — That" at the relevant Node.

我无法控制输入字符串,我需要输出" This — That"。

如果我使用StringEscapeUtils.unescapeHtml,则输出为" This — That"这不是我需要的。

我还尝试过几个transformer.setOutputProperty(OutputKeys.ENCODING, "encoding")版本,但还没有找到可以转换" "到" —"。

如何防止javax.xml.transform.Transformer重新转义已经正确转义的文本,或者如何转换输入以获取输出中的实体?

请解释这是重复的。

引用的问题有问题"
 &安培;#10;"由于实体正在得到解决,因此正在转换为CRLF。解决方案是逃避实体。

我的问题恰恰相反。文本已经转义,变换器正在重新转义文本。 "&安培; MDASH;"输出"& amp; mdash;"。

我无法使用该解决方案对所有"& amp;"进行后转换。 - > "&安培;"因为并非所有节点都代表html。

更完整的代码:

TransformerFactory factory = TransformerFactory.newInstance();
Transformer t = factory.newTransformer();
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbFactory.newDocumentBuilder();
Document document = builder.newDocument();
Element rootElement = document.createElement("Test");
rootElement.appendChild(document.createTextNode("This — That");
document.appendChild(rootElement);

DOMImplementation domImpl = bgDoc.getImplementation();
DocumentType docType = domImpl.createDocumentType("Test",
                "-//Company//program//language",
                "test.dtd");
t.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, docType.getPublicId());
t.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, docType.getSystemId());
StringWriter writer = new StringWriter();
StreamResult rslt = new StreamResult(writer);
Source src = new DOMSource(document);
t.transform(src, rslt);
System.out.println(writer.toString());

// outputs xml header, then "<Test>This &amp;mdash; That</Test>"

1 个答案:

答案 0 :(得分:1)

事实上,一旦你有了一个DOM树,就不再有一个带有&mdash;的字符串了:它在内部表示为一个Unicode字符串。

因此,要输入原始字符串,您需要解析它到Node,并输出序列化一个Node

关于序列化,还有一些其他问题,包括Change the com.sun.org.apache.xml.internal.serialize.XMLSerializer & com.sun.org.apache.xml.internal.serialize.OutputFormat

要解析单个节点,有LSParser.parseWithContext