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;
}
}
红线部分是容易出问题的地方,希望以后可以避免这种问题出现
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;
}
}
红线部分是容易出问题的地方,希望以后可以避免这种问题出现
相关文章推荐
- 使用IdHttp获取网页代码出现的问题,只能得到部分代码,为什么,请大家帮忙
- C#从剪贴板获取HTML格式内容含中文字符出现的问题和解决方法
- 在论坛中出现的比较难的sql问题:18(字符合并 整数解析星期几)
- oracle 数据库,通过resultSet.getObject()获取时间类型截断的问题的解析(格式化时间不能完全输出,也就是只能到日,小时后面的没有了)
- android开发,安装带有特殊字符名称的apk,解析包时出现问题
- Java String方法获取字符出现次数及字符最大相同部分示例
- VC轻松解析XML文件--CMarkup使用方法(解决解析中文字符出现乱码问题)
- sax解析xml文件出现编码错误问题Invalid byte 1 of 1-byte UTF-8 sequence.
- 关于XML字符串中出现非法字符导致解析出错的问题
- jquery解析服务器端传输回来string字符,datatype为json时出现的问题
- 关于poi解析word和excel的问题,解析word中的table,获取部分table的行数和列数不正确
- Hibernate使用jdbc只能获取单字符问题
- VC轻松解析XML文件--CMarkup使用方法(解决解析中文字符出现乱码问题)
- 编码为 UTF-8 的JSP 文件中出现非法字符 &#65279; 问题
- 在php中使用mb_substr($row['title'],0,15,'utf-8')解决获取的字符后面几们的乱码问题
- AJAX 无法解析 &amp; 等字符 问题
- 关于用户自定义的userbean出现无法解析的问题
- PHP返回mysql数据库中文字符出现乱码问题之解决方案
- Asp.net中处理请求中含有&字符的解析报400错误的问题
- 解决Java获取文件路径出现乱码的问题