2015-12-02 32 views
0

使用XML文档时,我使用了已包含XML实体的字符串,并希望它们按原样插入。但是,出现这种情况,而不是:使用javax.xml.transform.Transformer中的原始文本

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正确地重新转义转义的文本,或者如何转换输入以获取输出中的实体?

请解释这是如何重复。

引用的问题有问题,“
 
”正在转化为CRLF,因为这些实体正在得到解决。解决办法是逃避实体。

我的问题是相反的。文本已经被转义并且转换器正在重新转义文本。 “& mdash;”正在输出“& amp; mdash”。

我无法使用该解决方案后转换所有“&安培;” - >“&”,因为不是所有节点都代表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>" 
+0

您需要将其解析为XML而不是文本节点。 – SLaks

+0

请您重新审查这个重复的状态。 重复的问题是从String生成输出。生成输出解析实体,所以必须转义。 我的问题是从String生成输入。生成输入转义实体,所以s将获得额外的转义标记。 我的问题是不保留实体字符,如重复的问题。我保持足够好。太好。我收到我不想要的演员。 – tzimnoch

+0

'documentBuilder.parse'应该正是你想要的。 – SLaks

回答

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

+0

感谢您花时间了解我的问题并提供一些选项。 – tzimnoch