xml解析報錯:Invalid byte 2 of 2-byte UTF-8 sequence
在做接口解析時候出現的錯誤:Invalid byte 2 of 2-byte UTF-8 sequence. Nested exception: Invalid byte 2 of 2-byte UTF-8 sequence.
非常明顯是在讀取XML文件時候出現的編碼問題!
在測試過程中發現,主要原因是xml文件里聲明的編碼與xml文件本身保存時的編碼不一致。
如今解決的辦法就有幾個,主要說我測試過的兩個方。
假設你是直接以文件的形式讀取 能夠更改XML文件里的 UTF-8編碼 改為 GBK或GB2312 .
另一種可能是 你直接以URL 通過網絡地址獲取InputStream流形式讀取 在轉換成Document對象。這樣的方法的解決的方法是先down 下來保存在本地。
實現比較簡單 用個OutputStream流寫到你想保存的文件夾就可以。
再解析down下來的文件 當中在 SAXReader saxReader = new SAXReader();
正常寫法:
private ImpowerDeviceVo getResponseXml(String requestUrl, String requestXml) throws Exception
{
if (StringUtils.isEmpty(requestUrl))
{
String message = "config-WebPortal.xml配置文件未配置,獲取接口連接為空!";
logger.debug(message);
logger.error(message);
}
URL httpurl = new URL(requestUrl);
HttpURLConnection httpConn = (HttpURLConnection) httpurl.openConnection();
httpConn.setConnectTimeout(ImpowerXmlNodeName.connectTimeout);
httpConn.setReadTimeout(ImpowerXmlNodeName.readTimeout);
httpConn.setRequestMethod(ImpowerXmlNodeName.requestMethod);
httpConn.setDoInput(true);
// 將doOutput標志設置為true,指示應用程序要將數據寫入URL連接。
httpConn.setDoOutput(true);
OutputStream out = httpConn.getOutputStream();
logger.debug("requestXml:" + requestXml);
// 將參數寫入URL接口連接
out.write(requestXml.getBytes("utf-8"));
SAXBuilder sax = new SAXBuilder();
Document doc = sax.build(httpConn.getInputStream());
// 獲取到信息
ImpowerDeviceVo impowerDeviceVo = this.getImpowerDeviceVoByDocument(doc);
httpConn.disconnect();
out.close();
return impowerDeviceVo;
}
改動方法例如以下:
造一個暫時文件保存所定的編碼報文。然后讀取,讀取解析后關閉流。再刪除文件,否則會報文件讀取多誤 read error
private ImpowerDeviceVo getResponseXml(String requestUrl, String requestXml) throws Exception
{
if (StringUtils.isEmpty(requestUrl))
{
String message = "config-WebPortal.xml配置文件未配置,獲取接口連接為空!";
logger.debug(message);
logger.error(message);
}
URL httpurl = new URL(requestUrl);
HttpURLConnection httpConn = (HttpURLConnection) httpurl.openConnection();
httpConn.setConnectTimeout(ImpowerXmlNodeName.connectTimeout);
httpConn.setReadTimeout(ImpowerXmlNodeName.readTimeout);
httpConn.setRequestMethod(ImpowerXmlNodeName.requestMethod);
httpConn.setDoInput(true);
// 將doOutput標志設置為true。指示應用程序要將數據寫入URL連接。
httpConn.setDoOutput(true);
OutputStream out = httpConn.getOutputStream();
logger.debug("requestXml:" + requestXml);
// 將參數寫入URL接口連接
out.write(requestXml.getBytes("utf-8"));
InputStream inputStream = httpConn.getInputStream();
String fileName = "tempxml.xml";
// 保存文件
File f = new File(fileName);
if (!f.exists())
{
f.createNewFile();
}
String xmlContent = readXmlStream(inputStream);
System.out.println("進入-----------"+xmlContent);
FileOutputStream fileOutputStream = new FileOutputStream(f);
fileOutputStream.write(xmlContent.getBytes("utf-8"));
fileOutputStream.close();
// 打開文件
f = new File(fileName);
FileInputStream fileInputStream = new FileInputStream(f);
SAXBuilder sax = new SAXBuilder();
// Document doc = sax.build(httpConn.getInputStream());
Document doc = sax.build(fileInputStream);
// 獲取到信息
ImpowerDeviceVo impowerDeviceVo = this.getImpowerDeviceVoByDocument(doc);
httpConn.disconnect();
out.close();
fileInputStream.close();
f.delete();
return impowerDeviceVo;
}