xml:Invalid byte 2 of 2-byte UTF-8 sequence


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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM