Java SAXReader不重新显示ECAP字符

Java SAXReader不重新显示ECAP字符,java,dom,dom4j,Java,Dom,Dom4j,我正在用dom4j读取一个XML文件。该文件如下所示: ... <Field>&#13;&#10; hello, world...</Field> ... 我进行一些处理,然后使用asXml()编写另一个文件。但是字符没有像原始文件中那样转义,这导致使用该文件的外部系统出错 我怎样才能逃过这个特殊的字符而拥有 写入文件时?您无法轻松完成。这些不是“转义”,而是“角色实体”。它们是XML的基本组成部分。Xerces对“未解析实体”有一些非常

我正在用dom4j读取一个XML文件。该文件如下所示:

...
<Field>&#13;&#10; hello, world...</Field>
...
我进行一些处理,然后使用
asXml()
编写另一个文件。但是字符没有像原始文件中那样转义,这导致使用该文件的外部系统出错


我怎样才能逃过这个特殊的字符而拥有

写入文件时?

您无法轻松完成。这些不是“转义”,而是“角色实体”。它们是XML的基本组成部分。Xerces对“未解析实体”有一些非常复杂的支持,但我怀疑它是否适用于这些实体,而不是DTD中定义的物种。

这取决于您得到什么和想要什么(请参阅我之前的评论)

SAX阅读器没有做错任何事情——XML给了您一个文字换行符。如果控制此XML,则需要在“r”或“n”字符(或两者)后插入\(反斜杠)字符,而不是换行符

如果不控制此XML,则需要在取回字符串后将换行符进行文字转换,转换为“\r\n”。在C#中,它将类似于:

myString = myString.Replace("\r\n", "\\r\\n");

XML实体在DOM中被抽象出来。内容是用字符串公开的,而不需要担心编码——在大多数情况下,编码是您想要的

但是SAX对实体的处理方式有一些支持。您可以尝试使用自定义的
EntityResolver#resolveEntity
创建
XMLReader
,并将其作为参数传递给
SAXReader
。但我认为这可能行不通:

解析器将调用此方法 在打开任何外部实体之前 除顶层文档实体外 (包括外部DTD子集, 内部引用的外部实体 DTD和外部实体 在文件中引用 元素)

否则,您可以尝试为SAX配置
LexicalHandler
,以便在遇到实体时收到通知。Javadoc for
LexicalHandler#Startenty
说:

报告一些内部事件的开始 和外部XML实体

您将无法更改分辨率,但这可能仍有帮助

编辑

您必须使用dom4j提供的
SAXReader
XMLWriter
读写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进行填充,并对输出流进行后处理以进行反向替换

示例(使用):


您也可以使用/、/、或/进行预处理和后处理。

您的意思是在字符串中获得文字换行符,还是在字符串中获得“\r\n”(即作为字符?)我获得了换行符文字。但这没关系,因为我想得到角色的&13 '你为什么要把它们保留为 '? 你想用XML实现什么?我需要读一个XML文件,读一些关于值和属性的东西,然后写一个新的…然后外部系统就完全崩溃了;从定义上讲,它不是一个“XML解析器”。好吧,也许您知道如何将换行符转义为“ ' 在编写新的xml时?我仅通过后处理Xml来使用org.dom4j.Document.asXml()。我对Dom4j非常生疏。我的问题是,我正在读取一个包含“ ', 进行一些转换,然后编写一个新的xml文件。在这个新的xml文件中,我希望有 ' 再一次。我不想要像“\r\n”或“\\r\\n”这样的东西,那你为什么担心逃离它们呢?我相信XECES(当然是C++版本)如果你对实际的文字换行符进行编码,它会像你以前那样出现。如果在重新编码之前对其进行转义,那么将在XML中获得字符“\r\n”,而不是 顺便说一句,C#中的双反斜杠确实是字符串中的一个反斜杠-这是告诉编译器不要将其视为转义序列的一种方式。好的,我编辑了我的问题,也许你知道如何做,它也会解决我的问题。
FileOutputStream fos = new FileOutputStream("simple.xml");
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(fos, format);
writer.write(doc);
writer.flush();
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();