XML请求的发送解析,map转化xml字符串

示例

public static void main(String[] args) {
   // TODO Auto-generated method stub
   String xmlData = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
         + "<GetCharListInfo>" + "<indexID>20170930111222</indexID>"
         + "<userId>123456789</userId>"
         + "<chkSum>04a532be5a613fe037079d2d341ce809</chkSum>"
         + "<memo>test Sample</memo>" + "</GetCharListInfo>";
   try {
      senfXMLDataByPost(url, xmlData);
   } catch (Exception e) {
      e.printStackTrace();
   }
   Map<String, Object> resultMap = new HashMap<>();
   resultMap.put("returnCode", "0002");
   resultMap.put("userId", 111);
   resultMap.put("indexID", 222);
   resultMap.put("charList", new HashMap<>());
   String result = multilayerMapToXml(resultMap, false, "GetCharListInfo");
   System.out.println(result);

   List<Map<String, Object>> list = new ArrayList<>();
   for (int i = 0; i <= 1; i++) {
      Map<String, Object> map = new HashMap<>();
      map.put("serverID", 1);
      map.put("serverName", "serverNameA");
      map.put("charID", "123");
      map.put("charName", "hotgirl");
      list.add(map);
   }
   Map<String, List<Map<String, Object>>> roleMap = new HashMap<>();
   roleMap.put("charInfo", list);
   resultMap.put("charList", roleMap);
   result = multilayerMapToXml(resultMap, false, "GetCharListInfo");
   System.out.println(result);
}

java解析传过来的XML数据封装为Map

public Map<String, Object> xmlAnalysis(HttpServletRequest request) {
   Map<String, Object> param = new TreeMap<>();
   try {
      // 获取HTTP请求的输入流
      // 已HTTP请求输入流建立一个BufferedReader对象
      BufferedReader br = new BufferedReader(
            new InputStreamReader(request.getInputStream(), "UTF-8"));
      String buffer = null;
      // 存放请求内容
      StringBuffer xml = new StringBuffer();
      while ((buffer = br.readLine()) != null) {
         // 在页面中显示读取到的请求参数
         xml.append(buffer);
      }
      String callbackMessage = xml.toString();
      if (!ObjectUtils.isEmpty(callbackMessage)) {
         Document doc = DocumentHelper.parseText(callbackMessage);
         Element rootElt = doc.getRootElement(); // 获取根节点Request
         System.out.println("根节点:" + rootElt.getName()); // 拿到根节点的名称
         Iterator iter = rootElt.elementIterator();
         while (iter.hasNext()) {
            Element recordEless = (Element) iter.next();
            param.put(recordEless.getName(), recordEless.getText());
         }
      }
   } catch (Exception e) {
      log.info("解析xml参数异常", e);
   }
   return param;
}

POST发送XML数据

public static String senfXMLDataByPost(String url, String xmlData)
      throws Exception {

   CloseableHttpResponse response = null;
   String result = null;
   // 创建HttpClient实例
   CloseableHttpClient httpclient = HttpClients.custom().build();

   try {
      HttpPost httppost = new HttpPost(url);

      HttpEntity re = new StringEntity(xmlData);
      httppost.addHeader("SOAPAction", "");
      httppost.addHeader("Context-Type", "text/xml;charset=UTF-8");
      httppost.setEntity(re);
      response = httpclient.execute(httppost);
      result = EntityUtils.toString(response.getEntity(), "UTF-8");
   } catch (Exception e) {
      throw new RuntimeException("WebService网络请求异常!", e);
   }

   response.close();
   httpclient.close();
   return result;
}

 

多层MAP转XML字符型串

/**
 * (多层)map转换为xml格式字符串
 *
 * @param map
 *            需要转换为xml的map
 * @param isCDATA
 *            是否加入CDATA标识符 true:加入 false:不加入
 * @return xml字符串
 */
public static String multilayerMapToXml(Map<String, Object> map,
      boolean isCDATA, String parentName) {
   Document doc = DocumentHelper.createDocument();
   doc.addElement(parentName);
   String xml = recursionMapToXml(doc.getRootElement(), parentName, map,
         isCDATA);
   return formatXML(xml);
}

/**
 * 格式化xml,显示为容易看的XML格式
 *
 * @param xml
 *            需要格式化的xml字符串
 * @return
 */
public static String formatXML(String xml) {
   String requestXML = null;
   try {
      // 拿取解析器
      SAXReader reader = new SAXReader();
      Document document = reader.read(new StringReader(xml));
      if (null != document) {
         StringWriter stringWriter = new StringWriter();
         // 格式化,每一级前的空格
         OutputFormat format = new OutputFormat("    ", true);
         // xml声明与内容是否添加空行
         format.setNewLineAfterDeclaration(false);
         // 是否设置xml声明头部
         format.setSuppressDeclaration(false);
         // 是否分行
         format.setNewlines(true);
         format.setExpandEmptyElements(true);
         XMLWriter writer = new XMLWriter(stringWriter, format);
         writer.write(document);
         writer.flush();
         writer.close();
         requestXML = stringWriter.getBuffer().toString();
      }
      return requestXML;
   } catch (Exception e) {
      log.error("格式化xml,失败 --> {}", e);
      return null;
   }
}

/**
 * multilayerMapToXml核心方法,递归调用
 *
 * @param element
 *            节点元素
 * @param parentName
 *            根元素属性名
 * @param map
 *            需要转换为xml的map
 * @param isCDATA
 *            是否加入CDATA标识符 true:加入 false:不加入
 * @return xml字符串
 */
@SuppressWarnings("unchecked")
private static String recursionMapToXml(Element element, String parentName,
      Map<String, Object> map, boolean isCDATA) {
   Element xmlElement = element.addElement(parentName);
   for (String key : map.keySet()) {
      Object obj = map.get(key);
      if (obj instanceof List) {
         List<Map<String, Object>> list = (List<Map<String, Object>>) obj;
         for (Map<String, Object> mapInfo : list) {
            recursionMapToXml(xmlElement, key, mapInfo, isCDATA);
         }
      } else if (obj instanceof Map) {
         recursionMapToXml(xmlElement, key, (Map<String, Object>) obj,
               isCDATA);
      } else {
         String value = obj == null ? "" : obj.toString();
         if (isCDATA) {
            xmlElement.addElement(key).addCDATA(value);
         } else {
            xmlElement.addElement(key).addText(value);
         }
      }
   }
   return xmlElement.asXML();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值