您的位置:首页 > 其它

SAX解析出现断字符问题,只能获取部分字符

2014-11-03 11:13 357 查看
最近接了前面一位同事的事情,遇到sax解析xml只能获取部分字符问题,今天把他记录在这里,以备以后参考:

import java.io.IOException;

import java.io.InputStream;

import java.io.PushbackInputStream;

import java.util.ArrayList;

import java.util.List;

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;

public class CopyOfSaxParseJob extends DefaultHandler {

String preTag = null;// 作用是记录解析时的上一个节点名称

List<Object> list = null;

Object object = null;

public List<Object> getSaxData(InputStream xmlStream) throws Exception {

SAXParserFactory factory = SAXParserFactory.newInstance();

SAXParser parser = factory.newSAXParser();

CopyOfSaxParseJob handler = new CopyOfSaxParseJob();

xmlStream = this.filterInputStream(xmlStream);

parser.parse(xmlStream, handler);

return handler.list;

}

private InputStream filterInputStream(InputStream xmlStream)

throws IOException {

// 写入临时文件

PushbackInputStream testin = new PushbackInputStream(xmlStream);

int ch = testin.read();

if (ch != 0xEF) {

testin.unread(ch);

} else if ((ch = testin.read()) != 0xBB) { // if ch==0xef

testin.unread(ch);

testin.unread(0xef);

} else if ((ch = testin.read()) != 0xBF) { // if ch ==0xbb

throw new IOException("错误的UTF-8格式文件");

}

return testin;

}

StringBuffer sb = new StringBuffer("");

@Override

public void characters(char[] ch, int start, int length)

throws SAXException {

//这个地方不能作为结束字符来操作,原来那个同事就是因为在这里处理了获取的值,

//结果只能获取部分字符,导致解析的时候出问题(加密后容易出现问题,如果没有加密可能影响不大)

sb.append(ch, start, length);

}

@Override

public void startDocument() throws SAXException {

list = new ArrayList<Object>();//返回的对象初始化

}

@Override

public void startElement(String uri, String localName, String qName,

Attributes attributes) throws SAXException {

sb.delete(0, sb.length());

//在这里初始化对象用来保存解析后的值

object = new Object();

preTag = qName;

}

@Override

public void endElement(String uri, String localName, String qName)

throws SAXException {

if (preTag != null) {

String content = sb.toString();

//获取整个字符,然后做其他操作。。。。。

object = content;

}

if ("object".equals(qName)) {//取初始节点

if (null != object) {

list.add(object);

}

}

preTag = null;

}

}

红线部分是容易出问题的地方,希望以后可以避免这种问题出现
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐