我有一个 XMLEventReader。它是从使用“UTF8”编码的 XMLInputFactory 构建的。我正在使用它来读取“编码”属性设置为“UTF-8”的 XML 文件。
我已验证 XML 文件在 Firefox 下正确查看。当您查看页面编码时,它会说它是 UTF-8。
我已将 XMLEventReader 设置为合并字符事件,如下所示:
reader.setProperty(XMLEventReader.IS_COALESCING, Boolean.TRUE);
XML 文档没有 DTD。这是有效的。
XMLEventReader 偶尔会报告已接收到内容为(减去引号)的 CHARACTERS 事件,例如:
r problems were most severe and frequent.) Did you sleep a lot more than usual nearly every night during that period?</text> Ð
请注意样本末尾附近存在标记标签,以及大写的荆棘。另请注意,该句子已被删除;大概在此之前还有另一个 CHARACTERS 事件,其中包含句子的前导部分。
为什么 XMLEventReader 搞砸了解析?为什么字符显示不正确?为什么 XMLEventReader 不合并 CHARACTERS 事件,如果是这样的话?为什么 StAX 如此丑陋和不可预测,令人难以置信?
我在 Mac 上使用我的 Java 运行时 (Java 6) 提供给我的 XMLEventReader。
这是一些示例 XML,当然我只是从我的编辑器中复制的,所以谁知道结果发生了什么字符转换,但无论如何:
<question id="BMHPD17">
<permittedResponseCount>1</permittedResponseCount>
<text>It’s hard for me to stay out of trouble. (Would you say this is true or false for you?)</text>
<namedAnswerSet idref="TrueFalse"></namedAnswerSet>
</question>
请注意第 3 行的“智能撇号”。
我通过对 CHARACTERS 事件做出反应,将其内容保存到堆栈上的字符串,然后对名称为“问题”的 END_ELEMENT 事件做出反应来阅读此内容。在接收到 END_ELEMENT 事件后,我检索了我刚才提到的字符串的值,并构造了一个 Java 对象,该对象将我刚才提到的字符串作为输入。
当我 System.out.println() 结果时,我(有时)得到我之前提到的虚假垃圾。
当我将 System.out 包装在带有“UTF8”编码集的 PrintWriter 中时,这样我就不会简单地根据平台的编码输出字符,我会得到相同的结果。