【发布时间】:2011-04-10 10:50:27
【问题描述】:
我有一个 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> Ð
请注意样本末尾附近存在标记标签,以及大写的 thorn。另请注意,该句子已被删除;大概在此之前还有另一个 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 中时,我不会简单地根据平台的编码输出字符,我会得到相同的结果。
【问题讨论】:
-
你能发布一些示例 xml 和你用来解析它的代码吗?
-
编辑了我的条目以显示一些示例 XML 以及我如何写出来。
-
和你用来解析它的代码?