gpt4 book ai didi

java - 在 javax.xml.transform.Transformer 中处理原始文本

转载 作者:行者123 更新时间:2023-12-01 10:48:26 25 4
gpt4 key购买 nike

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

请解释一下为什么这是重复的。

所引用的问题存在“ ”的问题由于实体正在被解析,因此被转换为 CRLF。解决方案是逃离实体。

我的问题是相反的。文本已经转义,转换器正在重新转义文本。 “—”正在输出“—”。

我无法使用该解决方案来后转换所有“&” -> “&”,因为并非所有节点都代表 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>"

最佳答案

事实是,一旦有了 DOM 树,就不再是带有 的字符串:而是在内部表示为 Unicode 字符串。

因此,要输入原始字符串,您需要将其解析Node,并输出序列化一个节点.

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

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

关于java - 在 javax.xml.transform.Transformer 中处理原始文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34049984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com