为什么XMLEventReader报告包含标记的CHARACTERS事件?

时间:2010-09-09 19:48:37

标签: java xml stax

我有一个XMLEventReader。它是使用带有“UTF8”编码的XMLInputFactory构建的。我用它来读取一个XML文件,其“encoding”属性设置为“UTF-8”。

我已验证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事件做出反应来读取它,将其内容保存到堆栈上的String,然后对名称为“question”的END_ELEMENT事件做出反应。在收到问题的END_ELEMENT事件后,我检索刚刚提到的字符串的值,并构造一个Java对象,它接受我刚刚提到的字符串作为输入。

当我在System.out.println()结果时,我(有时)得到了我之前提到的虚假垃圾。

当我在具有“UTF8”编码集的PrintWriter中包装System.out时,我不是简单地根据平台的编码输出字符,我得到相同的结果。

2 个答案:

答案 0 :(得分:2)

这是Mac OSX的JVM上的一个错误。控制台使用的字符编码不默认为UTF-8,即使默认字符编码的所有其他用法都是 UTF8。

答案 1 :(得分:0)

这是否与底层SAX事件相同,其中包括起始偏移量和长度?如果是这样,您可能会发现这些指定了排除标记的字符串区域。