XML解析:重写DefaultHandler.characters的注意事项

问题描述:
  使用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

		}
	}

}

你可能感兴趣的:(xml,算法)