SAX解析和特殊字符

我想使用SAX解析器从xml文件解析一些数据。 我的xml如下:

 Pies & past Fruits  

为了解析这些数据,我扩展了DefaultHandler。

解析后的输出是:

 cat 1 = Pies cat 2 = & cat 3 = past cat 4 = Fruits 

为什么会发生这种情况而不是:

 cat 1 = Pies & past cat 2 = Fruits 

我的猜测是你将每个characters调用视为提供cat元素的完整文本。 您应该对处理程序进行编码,以便对characters连续调用会累积文本,并且只在endElement事件上捕获它:

 public class CatHandler extends DefaultHandler { private StringBuilder chars = new StringBuilder(); public void startElement(String uri, String lName, String qName, Attributes a) { final String name = qName == null ? lName : qName; if ("cat".equals(name)) { chars.setLength(0); } else . . . } public void endElement(String uri, String lName, String qName) { final String name = qName == null ? lName : qName; if ("cat".equals(name)) { String catName = chars.toString(); // do something with cat name } else . . . } public void characters(char[] ch, int start, int length) { chars.append(ch, start, length); } 

characters()方法不必返回完整的文本元素。 相反,你应该整理每个characters()调用中可用的文本,并在相应的endElement()调用上连接它们。

从文档 :

解析器将调用此方法来报告每个字符数据块。 SAX解析器可以在一个块中返回所有连续的字符数据, 或者它们可以将它分成几个块

(我的重点)