SAXReader 不重新转义字符
我正在使用 dom4j 读取 XML 文件。该文件如下所示:
...
<Field> hello, world...</Field>
...
我使用 SAXReader
将文件读取到 Document
中。当我在节点上使用 getText()
时,我获得以下字符串:
\r\n hello, world...
我进行一些处理,然后使用 asXml()
编写另一个文件。但这些字符并未像原始文件中那样进行转义,这会导致使用该文件的外部系统出现错误。
写入文件时如何转义特殊字符并具有
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

发布评论
评论(4)
XML 实体在 DOM 中被抽象出来。内容通过 String 公开,无需担心编码——这在大多数情况下都是您想要的。
但是 SAX 对实体的处理方式有一些支持。您可以尝试使用自定义 EntityResolver#resolveEntity
创建一个 XMLReader
,并将其作为参数传递给 SAXReader
。但我觉得它可能行不通:
解析器将调用此方法
在打开任何外部实体之前
除了顶级文档实体
(包括外部 DTD 子集,
内部引用的外部实体
DTD 和外部实体
文档中引用的
元素)
否则,您可以尝试为 SAX 配置一个 LexicalHandler
,以便在遇到实体时收到通知。 LexicalHandler#startEntity
的 Javadoc 说:
报告一些内部的开始
和外部 XML 实体。
您将无法更改分辨率,但这可能仍然有帮助。
编辑
您必须使用 dom4j 提供的 SAXReader
和 XMLWriter
读取和写入 XML。请参阅读取 XML 文件 和编写XML 文件。不要使用 asXml()
并自行转储文件。
FileOutputStream fos = new FileOutputStream("simple.xml");
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(fos, format);
writer.write(doc);
writer.flush();
您可以预处理输入流以将 &
替换为 [$AMPERSAND_CHARACTER$]
,然后使用 dom4j 执行这些操作,并对输出流进行后处理,从而使回替。
示例(使用 streamflyer):
import com.github.rwitzel.streamflyer.util.ModifyingReaderFactory;
import com.github.rwitzel.streamflyer.util.ModifyingWriterFactory;
// Pre-process
Reader originalReader = new InputStreamReader(myInputStream, "utf-8");
Reader modifyingReader = new ModifyingReaderFactory().createRegexModifyingReader(originalReader, "&", "[\\$AMPERSAND_CHARACTER\\$]");
// Read and modify XML via dom4j
SAXReader xmlReader = new SAXReader();
Document xmlDocument = xmlReader.read(modifyingReader);
// ...
// Post-process
Writer originalWriter = new OutputStreamWriter(myOutputStream, "utf-8");
Writer modifyingWriter = new ModifyingWriterFactory().createRegexModifyingWriter(originalWriter, "\\[\\$AMPERSAND_CHARACTER\\$\\]", "&");
// Write to output stream
OutputFormat xmlOutputFormat = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(modifyingWriter, xmlOutputFormat);
xmlWriter.write(xmlDocument);
xmlWriter.close();
您还可以使用 FilterInputStream/FilterOutputStream, PipedInputStream/"="">PipedOutputStream,或 ProxyInputStream/ProxyOutputStream 用于预处理和后处理。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
你不能轻易。这些不是“逃避”,而是“角色实体”。它们是 XML 的基本组成部分。 Xerces 对“未解析实体”有一些非常复杂的支持,但我怀疑它是否适用于这些实体,而不是 DTD 中定义的种类。
You cannot easily. Those aren't 'escapes', they are 'character entities'. They are a fundamental part of XML. Xerces has some very complex support for 'unparsed entities', but I doubt that it applies to these, as opposed to the species that are defined in a DTD.