zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    【未完成】【oracle】add_months与add_days
    【java】[null]的问题
    PID控制算法研究
    matlab函数:residue和residuez的用法
    Windows入门基础:2.vs2013中Icon显示
    关于for()循环使用过程中遇到的问题(俄罗斯方块游戏中遇到的问题)
    Windows入门基础:1.关于CreateWindow()函数使用中遇到的问题
    error C4996: 'swprintf': swprintf has been changed to conform with the ISO C standard,set _CRT_NON_CONFORMING_SWPRINT
    QT5.3.2与VS2013 fatal error LNK1112: 模块计算机类型“X86”与目标计算机类型“x64”冲突_(解决方案)
    Java如何访问private变量
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5387975.html
Copyright © 2011-2022 走看看