示例
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(); }