6

我有一个联系人在解析 RSS 和 Atom 文件时遇到了 SAX 问题。据他说,就好像来自 Item 元素的文本在撇号或有时是重音字符处被截断。编码似乎也有问题。

我已经尝试过 SAX,我也进行了一些截断,但无法进一步挖掘。如果有人以前解决过这个问题,我会很感激一些建议。

这是 ContentHandler 中使用的代码:

public void characters( char[], int start, int end ) throws SAXException {
//
    link = new String(ch, start, end);

编辑:编码问题可能是由于将信息存储在字节数组中,因为我知道 Java 在 Unicode 中工作。

4

3 回答 3

13

characters() 方法不能保证一次性为您提供文本元素的完整字符内容 - 全文可能跨越缓冲区边界。您需要自己在开始和结束元素事件之间缓冲字符。

例如

StringBuilder builder;

public void startElement(String uri, String localName, String qName, Attributes atts) {
   builder = new StringBuilder();
}

public void characters(char[] ch, int start, int length) {
   builder.append(ch,start,length);
}

public void endElement(String uri, String localName, String qName) {
  String theFullText = builder.toString();
}
于 2009-12-11T21:01:33.203 回答
5

XML 实体在 SAX 中生成特殊事件。您可以使用LexicalHandler捕获它们,尽管通常没有必要。但这解释了为什么不能假设每个标签只会收到一个字符事件。使用其他答案中解释的缓冲区。

例如hello&world将生成序列

  • 开始元素
  • 字符你好
  • 开始实体
  • 人物 &
  • 结束实体
  • 人物世界

如果您想要更多示例,请查看辅助 SAX 接口。其他特殊事件是外部实体、评论、CDATA 等。

于 2009-12-11T22:16:39.647 回答
1

您如何将输入传递给 SAX?作为 InputStream(推荐)还是 Reader?因此,从您的 byte[] 开始,尝试使用ByteArrayInputStream

于 2009-12-11T19:40:14.473 回答