Soap Message Formator

本文介绍了一个用于美化XML字符串的Java工具类,该工具能够将压缩的XML字符串转换为易读的格式,特别适用于查看WebService中的SOAP请求和响应。

在开发webservice 的程序中,我们经常要把soap request 跟soap response要打出来查看,但是如果我们取soap body中的内容打出的化会是很长的一个xml string,非常的不可读,以下class提供的一个方法把xml string format成可读的格式.

例如

<Root><child1>test1</child1><child2>test2</chidl2></Root>

格式化以后

<Root>

   <child1>test1</child1>

  <child2>test2</child2>

 

</Root>

public class IndentFormatter { 
    private static final Pattern ELEMENT = Pattern.compile("<[^<^>]+>|[^<^>]+"); 

    private static final Pattern ELEMENT_START = Pattern.compile("<[^/][^<^>]+[^/]>"); 

    private static final Pattern ELEMENT_END = Pattern.compile("</[^<^>]+>"); 

    private static final Pattern ELEMENT_EMPTY = Pattern.compile("<[^<^>]+/>"); 

    private static final Pattern ELEMENT_TEXT = Pattern.compile("[^<^>]+"); 

    private static Map<Integer, String> indentPool = new HashMap<Integer, String>(); 

    private static final String INDENT = "  "; 

    public static String format(String xml) { 
        StringBuffer buffer = new StringBuffer(); 
        try { 

            Matcher matcher = ELEMENT.matcher(xml); 

            int level = 0; 
            String prev = null; 
            while (matcher.find()) { 
                String g = matcher.group(); 
                if (isStartElement(g)) { 
                    if (isStartElement(prev)) { 
                        level++; 
                    } 
                    if (prev != null) { 
                        buffer.append("\n"); 
                    } 
                    buffer.append(indent(level) + g); 
                } else if (isText(g)) { 
                    buffer.append(g); 
                } else if (isEmptyElement(g)) { 
                    if (isStartElement(prev)) { 
                        level++; 
                    } 
                    buffer.append("\n" + indent(level) + g); 
                } else if (isEndElement(g)) { 
                    if (isEndElement(prev) || isEmptyElement(prev)) { 
                        level--; 
                        buffer.append("\n" + indent(level)); 
                    } 
                    buffer.append(g); 
                } 
                prev = g; 
            } 
        } catch (Throwable e) { 
            return xml; 
        } 
        return buffer.toString(); 
    } 

    private static boolean isStartElement(String node) { 
        if (node == null) { 
            return false; 
        } 
        return ELEMENT_START.matcher(node).matches(); 
    } 

    private static boolean isEndElement(String node) { 
        if (node == null) { 
            return false; 
        } 
        return ELEMENT_END.matcher(node).matches(); 
    } 

    private static boolean isEmptyElement(String node) { 
        if (node == null) { 
            return false; 
        } 
        return ELEMENT_EMPTY.matcher(node).matches(); 
    } 

    private static boolean isText(String node) { 
        if (node == null) { 
            return false; 
        } 
        return ELEMENT_TEXT.matcher(node).matches(); 
    } 

    private static String indent(int level) { 
        if (level < 1) { 
            return ""; 
        } 
        String indent = indentPool.get(level); 
        if (indent == null) { 
            StringBuffer buffer = new StringBuffer(); 
            for (int i = 0; i < level; i++) { 
                buffer.append(INDENT); 
            } 
            indent = buffer.toString(); 
            indentPool.put(level, indent); 
        } 
        return indent; 
    } 

} 

 

@app.route('/send_email', methods=['POST']) def handle_send_email(): """接收前端请求并调用邮件函数""" try: data = request.get_json() print(data) sjr = data.get('sjr', '').strip() csr = data.get('csr', '').strip() tbbt = data.get('tbbt', '').strip() tbnr = data.get('tbnr', '').strip() fjr = data.get('fjr', 'IDS').strip() if not sjr or not tbbt or not tbnr: return jsonify({"success": False, "message": "缺少必要参数"}), 400 result = send_mail_soap(sjr=sjr, csr=csr, tbbt=tbbt, tbnr=tbnr, fjr=fjr) return jsonify(result) except Exception as e: return jsonify({"success": False, "message": f"服务器错误: {str(e)}"}), 500{'sjr': 'X2527715', 'csr': '', 'tbbt': '【健康报告】李婷 的体检数据 (2025/9/19)', 'tbnr': '\nimport requests import html import urllib3 # 忽略 SSL 警告 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) def send_mail_soap(sjr: str, csr: str, tbbt: str, tbnr: str, fjr: str): msgd = '''<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ManualSend_08 xmlns="http://tempuri.org/"> <strMailCode>{0}</strMailCode> <strFormUser>{5}</strFormUser> <strRecipients>{1}</strRecipients> <strCopyRecipients>{2}</strCopyRecipients> <strSubject>{3}</strSubject> <strBody>{4}</strBody> </ManualSend_08> </soap:Body> </soap:Envelope>''' try: # HTML 转义防止 XML 错误 tbnr = html.escape(tbnr) tbbt = html.escape(tbbt) msgc = msgd.format("QFhky2Qfy8g=", sjr, csr, tbbt, tbnr, fjr) headers = { "Host": "ids.cdn.corpnet.auo.com", "Content-Type": "text/xml; charset=utf-8", "Content-Length": str(len(msgc)), "SOAPAction": "http://tempuri.org/ManualSend_08" } response = requests.post( "https://ids.cdn.corpnet.auo.com/ids_ws/mail.asmx", data=msgc, headers=headers, verify=False ) if response.status_code == 200: return {"success": True, "message": "邮件发送成功!", "response": response.text} else: return {"success": False, "message": f"HTTP {response.status_code}", "response": response.text} except Exception as e: return {"success": False, "message": f"请求异常: {str(e)}"}为什么会没有收到邮件
09-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值