import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.util.Map;
import mqq.sdet.dbt.protocol.DBTResp;
import mqq.sdet.xhttp.XResp;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
/**
* @author just
* @since XHttp 0.9
*
*/
public class XMLEndecoder {
public static final String XML_DECLARATION = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
public static final String DEFAULT_ENCODING = "UTF-8";
public static final String REQ = "REQ";
public static final String RESP= "RESP";
protected String encoding;
protected XStream xstream = new XStream(new DomDriver());
public XMLEndecoder(){
setEncoding(DEFAULT_ENCODING);
}
public XMLEndecoder(String en){
setEncoding(en);
}
public String getEncoding() {
return encoding;
}
public void setEncoding(String encoding) {
this.encoding = encoding;
}
public void encodeReq(Object req,OutputStream os) throws IOException{
encode(req,os);
}
public void encodeResp(XResp resp,OutputStream os) throws IOException{
encode(resp,os);
}
public void encode(Object object,OutputStream os) throws IOException{
if(object == null){
throw new IOException("Encode:Instance can not be null!");
}
Writer wt = null;
try {
wt = new OutputStreamWriter(os,encoding);
wt.write(XML_DECLARATION);
xstream.toXML(object, wt);
} catch (IOException e) {
throw e;
}finally{
if(wt != null){
wt.close();
}
}
}
public XResp decodeResp(InputStream is) throws IOException{
Reader reader = null;
XResp resp = null;
try {
reader = new InputStreamReader(is,encoding);
resp = (XResp)xstream.fromXML(reader);
} catch (IOException e) {
throw e;
}finally{
if(reader != null){
reader.close();
}
}
return resp;
}
// public XReq decodeReq(InputStream is) throws IOException{
// Reader reader = null;
// XReq req = null;
// try {
// reader = new InputStreamReader(is,encoding);
// req = (XReq)xstream.fromXML(reader);
// } catch (IOException e) {
// throw e;
// }finally{
// if(reader != null){
// reader.close();
// }
// }
// return req;
// }
@SuppressWarnings("unchecked")
public Map<String,String> decodeMap(InputStream is) throws IOException{
Reader reader = null;
Map<String,String> handleMap = null;
try {
reader = new InputStreamReader(is,encoding);
handleMap = (Map<String, String>) xstream.fromXML(reader);
} catch (IOException e) {
throw e;
}finally{
if(reader != null){
reader.close();
}
}
return handleMap;
}
//@SuppressWarnings("unchecked")
public Object decodeObject(InputStream is) throws IOException{
Reader reader = null;
Object object = null;
try {
reader = new InputStreamReader(is,encoding);
object = xstream.fromXML(reader);
} catch (IOException e) {
throw e;
}finally{
if(reader != null){
reader.close();
}
}
return object;
}
}
--------------------------------------------------------上面是解析xml为object方法------------------------------
-----------------------------调用如下------------------
public static void main(String[] args){
XMLEndecoder endecoder = new XMLEndecoder();
endecoder.setEncoding("UTF-8");
DBTResp resp;
try {
resp = (DBTResp) endecoder.decodeObject(new FileInputStream("C:\\DBTResp.xml"));
System.out.println(resp.getModuleName());
System.out.println(resp.taskResults.size());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
如果 DBTResp.xml 文件用记事本打开另存为utf-8就会报错。。。Content is not allowed in prolog
解决方法: 文件用记事本打开另存为ASCII就可以