问题描述:
使用SAX解析XML时,重写DefaultHandler.characters方法,用来获取elemnt之间的content。但是,偶尔获取的content不全。
问题原因:
查看javadoc找到原因,如下:【编写代码时不能假定一次读入一个 char 的算法将适用于字符单元;在某些情况下这些算法将拆分一些字符。这与在什么情况下 XML 允许有任意字符(如属性值、处理指令数据、注解以及从此方法中报告的数据)相关。通常还与 Java 代码控制国际化的文本时相关;该问题不是 XML 独有的。】
具体内容参照代码修改点。
使用SAX解析XML时,重写DefaultHandler.characters方法,用来获取elemnt之间的content。但是,偶尔获取的content不全。
问题原因:
查看javadoc找到原因,如下:【编写代码时不能假定一次读入一个 char 的算法将适用于字符单元;在某些情况下这些算法将拆分一些字符。这与在什么情况下 XML 允许有任意字符(如属性值、处理指令数据、注解以及从此方法中报告的数据)相关。通常还与 Java 代码控制国际化的文本时相关;该问题不是 XML 独有的。】
具体内容参照代码修改点。
public class SAXModelHandler extends DefaultHandler {
//2010-10-29 change by huanghao start
// private String currentValue = null;
private StringBuffer currentValue = new StringBuffer();
//2010-10-29 change by huanghao end
public void characters(char[] ch, int start, int length)
throws SAXException {
// 取出目前节点对应的值
//2010-10-29 change by huanghao start
// currentValue = new String(ch, start, length).replaceAll("\n", "").replaceAll("\t", "");
currentValue.append(ch, start, length);
//2010-10-29 change by huanghao end
}
public void startElement(String uri, String localName, String qName,
Attributes attr) throws SAXException {
//2010-10-29 add by huanghao start
currentValue.delete(0, currentValue.length());
//2010-10-29 add by huanghao end
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
//2010-10-29 add by huanghao change
// if(currentValue != null && !currentValue.equals("\n\t\t\t")){
// params = currentValue.split(",");
// }
String value = currentValue.toString().trim();
if(value != null && !value.equals("\n\t\t\t")){
params = value.split(",");
}
//2010-10-29 add by huanghao change
}
}
}