You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

379 lines
16 KiB
Java

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.engine.util;
import com.alibaba.druid.util.StringUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import weaver.general.BaseBean;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class XMLUtils {
//构建返回值
public static String count2XML(Map<String,String> headerParam,Integer todocount , Integer toreadcount ) {
try {
// 创建文档对象
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.newDocument();
// 创建根节点
Element rootElement = doc.createElement("Service");
doc.appendChild(rootElement);
addServiceHeader(doc,rootElement,headerParam);
// 创建Service_Body节点
Element serviceBodyElement = doc.createElement("Service_Body");
rootElement.appendChild(serviceBodyElement);
// 创建response节点
Element responseElement = doc.createElement("response");
serviceBodyElement.appendChild(responseElement);
// 创建todo节点
Element todoElement = doc.createElement("todo");
responseElement.appendChild(todoElement);
// 创建count节点并设置值
if(todocount != null) {
Element countElement = doc.createElement("count");
countElement.setTextContent(todocount + "");
todoElement.appendChild(countElement);
}
if(toreadcount != null){
Element countOneElement = doc.createElement("countOne");
countOneElement.setTextContent(toreadcount+"");
todoElement.appendChild(countOneElement);
}
// 将文档对象转换为XML字符串
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); // 设置不包含XML声明
DOMSource source = new DOMSource(doc);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
StreamResult result = new StreamResult(outputStream);
transformer.transform(source, result);
// 将XML结果转换为字符串
String xmlString = outputStream.toString("UTF-8");
//System.out.println(xmlString);
return xmlString;
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
private static void addServiceHeader(Document doc, Element rootElement, Map<String, String> headerParam) {
// 创建Service_Body节点
Element serviceHeaderElement = doc.createElement("Service_Header");
rootElement.appendChild(serviceHeaderElement);
//service_sn ESB服务流水号
if (!StringUtils.isEmpty(headerParam.get("service_sn"))){
Element serviceSnElement = doc.createElement("service_sn");
serviceSnElement.setTextContent(headerParam.get("service_sn"));
serviceHeaderElement.appendChild(serviceSnElement);
}
if (!StringUtils.isEmpty(headerParam.get("service_id"))){
Element serviceIdElement = doc.createElement("service_id");
serviceIdElement.setTextContent(headerParam.get("service_id"));
serviceHeaderElement.appendChild(serviceIdElement);
}
if (!StringUtils.isEmpty(headerParam.get("system_id"))){
Element systemIdElement = doc.createElement("system_id");
systemIdElement.setTextContent(headerParam.get("system_id"));
serviceHeaderElement.appendChild(systemIdElement);
}
if (!StringUtils.isEmpty(headerParam.get("requester_id"))){
Element requesterIdElement = doc.createElement("requester_id");
requesterIdElement.setTextContent(headerParam.get("requester_id"));
serviceHeaderElement.appendChild(requesterIdElement);
}
if (!StringUtils.isEmpty(headerParam.get("branch_id"))){
Element branchIdElement = doc.createElement("branch_id");
branchIdElement.setTextContent(headerParam.get("branch_id"));
serviceHeaderElement.appendChild(branchIdElement);
}
if (!StringUtils.isEmpty(headerParam.get("channel_id"))){
Element channelIdElement = doc.createElement("channel_id");
channelIdElement.setTextContent(headerParam.get("channel_id"));
serviceHeaderElement.appendChild(channelIdElement);
}
if (!StringUtils.isEmpty(headerParam.get("service_time"))){
Element serviceTimeElement = doc.createElement("requester_id");
serviceTimeElement.setTextContent(headerParam.get("service_time"));
serviceHeaderElement.appendChild(serviceTimeElement);
}
if (!StringUtils.isEmpty(headerParam.get("BnkSrlNo"))){
Element BnkSrlNoElement = doc.createElement("BnkSrlNo");
BnkSrlNoElement.setTextContent(headerParam.get("BnkSrlNo"));
serviceHeaderElement.appendChild(BnkSrlNoElement);
}
// if (!StringUtils.isEmpty(headerParam.get("FileFlg"))){
Element FileFlgElement = doc.createElement("FileFlg");
FileFlgElement.setTextContent("0");
serviceHeaderElement.appendChild(FileFlgElement);
// }
if (!StringUtils.isEmpty(headerParam.get("SvcCd"))){
Element SvcCdElement = doc.createElement("SvcCd");
SvcCdElement.setTextContent(headerParam.get("SvcCd"));
serviceHeaderElement.appendChild(SvcCdElement);
}
if (!StringUtils.isEmpty(headerParam.get("SvcScn"))){
Element SvcScnElement = doc.createElement("SvcScn");
SvcScnElement.setTextContent(headerParam.get("SvcScn"));
serviceHeaderElement.appendChild(SvcScnElement);
}
// 响应码
Element service_responseElement = doc.createElement("service_response");
serviceHeaderElement.appendChild(service_responseElement);
if (!StringUtils.isEmpty(headerParam.get("status"))){
Element statusElement = doc.createElement("status");
statusElement.setTextContent(headerParam.get("status"));
service_responseElement.appendChild(statusElement);
}
if (!StringUtils.isEmpty(headerParam.get("code"))){
Element codeElement = doc.createElement("code");
codeElement.setTextContent(headerParam.get("code"));
service_responseElement.appendChild(codeElement);
}
if (!StringUtils.isEmpty(headerParam.get("desc"))){
Element descElement = doc.createElement("desc");
descElement.setTextContent(headerParam.get("desc"));
service_responseElement.appendChild(descElement);
}
}
public static Map<String, String> parseXMLToMap2(String xmlString) {
Map<String, String> resultMap = new HashMap<>();
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new ByteArrayInputStream(xmlString.getBytes()));
Element rootElement = document.getDocumentElement();
extractValues(rootElement, resultMap);
} catch (Exception e) {
e.printStackTrace();
}
return resultMap;
}
private static void extractValues(Element element, Map<String, String> resultMap) {
NodeList childNodes = element.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
if (childNodes.item(i) instanceof Element) {
Element childElement = (Element) childNodes.item(i);
String nodeName = childElement.getNodeName();
String nodeValue = childElement.getTextContent();
resultMap.put(nodeName, nodeValue);
extractValues(childElement, resultMap);
}
}
}
public static String CW2XML(Map<String, String> headerParam, String retCd, String errorMessage) {
try {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.newDocument();
Element rootElement = doc.createElement("Service");
doc.appendChild(rootElement);
addServiceHeader(doc, rootElement, headerParam);
Element serviceBodyElement = doc.createElement("Service_Body");
rootElement.appendChild(serviceBodyElement);
Element responseElement = doc.createElement("response");
serviceBodyElement.appendChild(responseElement);
Element countOneElement;
if (retCd != null) {
countOneElement = doc.createElement("retCd");
countOneElement.setTextContent(retCd + "");
responseElement.appendChild(countOneElement);
}
if (errorMessage != null) {
countOneElement = doc.createElement("errorMessage");
countOneElement.setTextContent(errorMessage + "");
responseElement.appendChild(countOneElement);
}
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty("omit-xml-declaration", "no");
DOMSource source = new DOMSource(doc);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
StreamResult result = new StreamResult(outputStream);
transformer.transform(source, result);
String xmlString = outputStream.toString("UTF-8");
String length = String.format("%08d", xmlString.length());
return length + xmlString;
} catch (Exception var16) {
var16.printStackTrace();
return "";
}
}
// public static Map<String, String> parseXMLToMap(String xmlString) {
// Map<String, String> resultMap = new HashMap<>();
// try {
// DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// DocumentBuilder builder = factory.newDocumentBuilder();
// Document document = builder.parse(new ByteArrayInputStream(xmlString.getBytes(StandardCharsets.UTF_8)));
//
// Element rootElement = document.getDocumentElement();
// // 直接从根元素开始处理
// NodeList children = rootElement.getChildNodes();
// for (int i = 0; i < children.getLength(); i++) {
// if (children.item(i).getNodeType() == Node.ELEMENT_NODE) {
// Element child = (Element) children.item(i);
// extractValues(child, resultMap);
// }
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
// return resultMap;
// }
//
// private static void extractValues(Element element, Map<String, String> resultMap) {
// // 检查是否有子元素
// boolean hasChildElement = false;
// NodeList childNodes = element.getChildNodes();
// for (int i = 0; i < childNodes.getLength(); i++) {
// if (childNodes.item(i).getNodeType() == Node.ELEMENT_NODE) {
// hasChildElement = true;
// break;
// }
// }
//
// // 如果有子元素,只处理子元素
// if (hasChildElement) {
// for (int i = 0; i < childNodes.getLength(); i++) {
// Node node = childNodes.item(i);
// if (node.getNodeType() == Node.ELEMENT_NODE) {
// Element childElement = (Element) node;
// String nodeName = childElement.getNodeName();
// // 去除前后空白字符
// String nodeValue = childElement.getTextContent().trim();
// resultMap.put(nodeName, nodeValue);
// // 不再递归调用以避免重复添加
// }
// }
// }
// }
public static void main(String[] args) {
System.out.println(new Date());
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Service><Service_Header><service_sn>1010157060000065445</service_sn><system_id>0258</system_id><requester_id>0157</requester_id><branch_id>010231100</branch_id><channel_id>01</channel_id><service_time>20240315092648</service_time><need_request>true</need_request><SvcCd>500130004</SvcCd><SvcScn>12</SvcScn><BnkSrlNo>015720240315060000065445</BnkSrlNo><FileFlg>0</FileFlg></Service_Header><Service_Body><request><path>todo</path><method>getCount2</method><args><entry><key>userNum</key><value>10110707</value></entry></args></request></Service_Body></Service>";
for (int i = 0; i < 2000; i++) {
new Thread() {
@Override
public void run() {
// System.out.println(parseXMLToMap2(xml));
parseXMLToMap(xml);
parseXMLToMap(xml);
parseXMLToMap(xml);
parseXMLToMap(xml);
printMemoryUsage();
}
}.start();
printMemoryUsage();
}
System.out.println(new Date());
}
public static Map<String, String> parseXMLToMap(String xmlString) {
new BaseBean().writeLog("XMLUtils:xmlString==>"+xmlString);
Map<String, String> resultMap = new HashMap<>();
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
InputStream xmlInput = new ByteArrayInputStream(xmlString.getBytes("UTF-8"));
saxParser.parse(xmlInput, new SAXHandler(resultMap));
} catch (Exception e) {
e.printStackTrace();
}
return resultMap;
}
private static class SAXHandler extends DefaultHandler {
private Map<String, String> resultMap;
private Stack<String> elementStack = new Stack<>();
private StringBuilder elementValue = new StringBuilder();
public SAXHandler(Map<String, String> resultMap) {
this.resultMap = resultMap;
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
elementStack.push(qName);
elementValue.setLength(0); // 清空字符缓存
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
String value = elementValue.toString().trim();
if (!value.isEmpty()) {
// 如果当前元素有值且没有子元素则将其添加到结果Map中
if (elementStack.size() > 1) {
resultMap.put(elementStack.peek(), value);
}
}
elementStack.pop();
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
elementValue.append(ch, start, length);
}
}
public static void printMemoryUsage() {
Runtime runtime = Runtime.getRuntime();
long totalMemory = runtime.totalMemory(); // JVM总内存
long freeMemory = runtime.freeMemory(); // JVM空闲内存
long usedMemory = totalMemory - freeMemory; // 已使用内存
// System.out.println("Total Memory: " + totalMemory + " bytes");
// System.out.println("Free Memory: " + freeMemory + " bytes");
System.out.println("Used Memory: " + usedMemory + " bytes");
}
}