diff --git a/pay-java-common/pom.xml b/pay-java-common/pom.xml index fc6d2b0..10ce445 100644 --- a/pay-java-common/pom.xml +++ b/pay-java-common/pom.xml @@ -25,10 +25,7 @@ com.alibaba fastjson - - org.jdom - jdom - + log4j diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/util/XML.java b/pay-java-common/src/main/java/com/egzosn/pay/common/util/XML.java index 56cf186..f4090a1 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/util/XML.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/util/XML.java @@ -1,53 +1,42 @@ package com.egzosn.pay.common.util; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.egzosn.pay.common.bean.result.PayException; import com.egzosn.pay.common.exception.PayErrorException; -import org.jdom2.Document; -import org.jdom2.Element; -import org.jdom2.JDOMException; -import org.jdom2.input.SAXBuilder; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.*; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; -import java.util.Iterator; -import java.util.List; +import java.io.StringWriter; import java.util.Map; /** * XML工具 - * @author egan - *
- * email egzosn@gmail.com
- * date 2016-6-2 19:45:06
- * 
+ * + * @author egan + *
+ *         email egzosn@gmail.com
+ *         date 2016-6-2 19:45:06
+ *         
*/ public class XML { - /** - * 解析xml并转化为Json值 - * @param content json字符串 - * @return Json值 - */ - public static JSONObject toJSONObject(String content){ - if (null == content || "".equals(content)) { - return null; - } - - try (InputStream in = new ByteArrayInputStream(content.getBytes("UTF-8"))){ - return (JSONObject) inputStream2Map(in, null); - } catch (IOException e) { - throw new PayErrorException(new PayException("IOException", e.getMessage())); - } - - - } /** * 解析xml并转化为json值 + * * @param in 输入流 * @return Json值 */ @@ -58,7 +47,7 @@ public class XML { } try { - return (JSONObject)inputStream2Map(in, null); + return (JSONObject) inputStream2Map(in, null); } catch (IOException e) { throw new PayErrorException(new PayException("IOException", e.getMessage())); } @@ -67,40 +56,42 @@ public class XML { } /** + * 解析xml并转化为Json值 * - * @param in xml输入流 - * @param m 参数集 - * @return 整理完成的参数集 - * @throws IOException xml io转化异常 + * @param content json字符串 + * @return Json值 */ - public static Map inputStream2Map(InputStream in, Map m) throws IOException { - if (null == m){ - m = new JSONObject(); + public static JSONObject toJSONObject(String content) { + + if (null == content || "".equals(content)) { + return null; } - SAXBuilder builder = new SAXBuilder(); - try { - Document doc = builder.build(in); - Element root = doc.getRootElement(); - List list = root.getChildren(); - Iterator it = list.iterator(); - while (it.hasNext()) { - Element e = (Element) it.next(); - String k = e.getName(); - Object v = ""; - List children = e.getChildren(); - if (children.isEmpty()) { - v = e.getTextNormalize(); - } else { - v = getChildren(children); - } - m.put(k, v); - } - } catch (JDOMException e) { - throw new PayErrorException(new PayException("JDOMException", e.getMessage())); + try (InputStream in = new ByteArrayInputStream(content.getBytes("UTF-8"))) { + return (JSONObject) inputStream2Map(in, null); + } catch (IOException e) { + throw new PayErrorException(new PayException("IOException", e.getMessage())); } - return m; + } + /** + * 解析xml并转化为Json值 + * + * @param content json字符串 + * @return Json值 + */ + public static T toBean(String content, Class clazz) { + + if (null == content || "".equals(content)) { + return null; + } + try (InputStream in = new ByteArrayInputStream(content.getBytes("UTF-8"))) { + return inputStream2Bean(in, clazz); + } catch (IOException e) { + throw new PayErrorException(new PayException("IOException", e.getMessage())); + } + + } /** @@ -109,46 +100,35 @@ public class XML { * @param children 集合 * @return String 子结点的xml */ - public static String getChildrenText(List children) { - StringBuffer sb = new StringBuffer(); - if (!children.isEmpty()) { - Iterator it = children.iterator(); - while (it.hasNext()) { - Element e = (Element) it.next(); - String name = e.getName(); - String value = e.getTextNormalize(); - List list = e.getChildren(); - sb.append("<" + name + ">"); - if (!list.isEmpty()) { - sb.append(getChildrenText(list)); + public static JSON getChildren(NodeList children) { + JSON json = null; + for (int idx = 0; idx < children.getLength(); ++idx) { + Node node = children.item(idx); + NodeList nodeList = node.getChildNodes(); + if (node.getNodeType() == Node.ELEMENT_NODE && nodeList.getLength() <= 1) { + if (null == json) { + json = new JSONObject(); + } + ((JSONObject) json).put(node.getNodeName(), node.getTextContent()); + } else if (node.getNodeType() == Node.ELEMENT_NODE && nodeList.getLength() > 1) { + if (null == json) { + json = new JSONObject(); + } + if (json instanceof JSONObject) { + JSONObject j = ((JSONObject) json); + if (j.containsKey(node.getNodeName())) { + JSONArray array = new JSONArray(); + array.add(json); + json = array; + } else { + j.put(node.getNodeName(), getChildren(nodeList)); + } } - sb.append(value); - sb.append(""); - } - } - return sb.toString(); - } - - /** - * 获取子结点的xml - * - * @param children 集合 - * @return String 子结点的xml - */ - public static Object getChildren(List children) { - JSONObject json = new JSONObject(); - if (!children.isEmpty()) { - Iterator it = children.iterator(); - while (it.hasNext()) { - Element e = (Element) it.next(); - String name = e.getName(); - String value = e.getTextNormalize(); - List list = e.getChildren(); - if (!list.isEmpty()) { - json.put(name, getChildren(list)); - }else { - json.put(name, value); + if (json instanceof JSONArray) { + JSONObject c = new JSONObject(); + c.put(node.getNodeName(), getChildren(nodeList)); + ((JSONArray) json).add(c); } } } @@ -156,25 +136,113 @@ public class XML { return json; } - /** - * 将请求参数转换为xml格式的string - * @param parameters 请求参数 - * @return xml + /*** + * xml 解析成对应的对象 + * @param in 输入流 + * @param clazz 需要转化的类 + * @param 类型 + * @return 对应的对象 + * @throws IOException xml io转化异常 */ - public static String getMap2Xml(Map parameters) { - StringBuffer sb = new StringBuffer(); - sb.append(""); - for (String key : parameters.keySet()){ - if ("attach".equalsIgnoreCase(key) || "body".equalsIgnoreCase(key) || "attach".equalsIgnoreCase(key) || "sign".equalsIgnoreCase(key)) { - sb.append("<" + key + ">" + ""); - } else { - sb.append("<" + key + ">" + parameters.get(key) + ""); - } - + public static T inputStream2Bean(InputStream in, Class clazz) throws IOException { + try { + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + org.w3c.dom.Document doc = documentBuilder.parse(in); + doc.getDocumentElement().normalize(); + NodeList children = doc.getDocumentElement().getChildNodes(); + JSON json = getChildren(children); + return json.toJavaObject(clazz); + } catch (Exception e) { +// e.printStackTrace(); + throw new PayErrorException(new PayException("XML failure", "XML解析失败\n" + e.getMessage())); + } finally { + in.close(); } - sb.append(""); - return sb.toString(); } + /** + * @param in xml输入流 + * @param m 参数集 + * @return 整理完成的参数集 + * @throws IOException xml io转化异常 + */ + public static Map inputStream2Map(InputStream in, Map m) throws IOException { + if (null == m) { + m = new JSONObject(); + } + try { + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + org.w3c.dom.Document doc = documentBuilder.parse(in); + doc.getDocumentElement().normalize(); + NodeList children = doc.getDocumentElement().getChildNodes(); + for (int idx = 0; idx < children.getLength(); ++idx) { + Node node = children.item(idx); + NodeList nodeList = node.getChildNodes(); + if (node.getNodeType() == Node.ELEMENT_NODE && nodeList.getLength() <= 1) { + m.put(node.getNodeName(), node.getTextContent()); + } else if (node.getNodeType() == Node.ELEMENT_NODE && nodeList.getLength() > 1) { + m.put(node.getNodeName(), getChildren(nodeList)); + } + } + } catch (Exception e) { +// e.printStackTrace(); + throw new PayErrorException(new PayException("XML failure", "XML解析失败\n" + e.getMessage())); + } finally { + in.close(); + } + return m; + } + + + + /** + * 将Map转换为XML格式的字符串 + * + * @param data Map类型数据 + * @return XML格式的字符串 + */ + public static String getMap2Xml(Map data) { + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder = null; + try { + documentBuilder = documentBuilderFactory.newDocumentBuilder(); + } catch (ParserConfigurationException e) { + e.printStackTrace(); + } + org.w3c.dom.Document document = documentBuilder.newDocument(); + org.w3c.dom.Element root = document.createElement("xml"); + document.appendChild(root); + for (String key : data.keySet()) { + Object value = data.get(key); + if (value == null) { + value = ""; + } + value = value.toString().trim(); + org.w3c.dom.Element filed = document.createElement(key); + filed.appendChild(document.createTextNode(value.toString())); + root.appendChild(filed); + } + try { + TransformerFactory tf = TransformerFactory.newInstance(); + Transformer transformer = tf.newTransformer(); + DOMSource source = new DOMSource(document); + transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + StringWriter writer = new StringWriter(); + StreamResult result = new StreamResult(writer); + transformer.transform(source, result); + String output = writer.getBuffer().toString(); //.replaceAll("\n|\r", ""); + return output; + } catch (TransformerException e) { + e.printStackTrace(); + } + + + return ""; + } + + }