论坛首页 Java企业应用论坛

Soap Message Formator

浏览 2520 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (7) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-11-25  
SOA

在开发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; 
    } 

} 

 

   发表时间:2009-11-26  
感觉就不是专门针对简单的SOAP消息了
对于XML-LIKE的文本,都能格式化

没试过
0 请登录后投票
   发表时间:2009-12-18   最后修改:2009-12-18
有个小bug,就是不能对<ID>元素解析,解析完后开始标签丢失掉   
public static void main(String[] args) {
       String str = "<Msgtype>advertise</Msgtype><ID>idtest</ID>         <UserID>+8613912345678</UserID>";
    	System.out.println(format(str));
    }

打印结果如下:

<Msgtype>advertise</Msgtype>idtest</ID>
<UserID>+8613912345678</UserID>

修正部分:
            while (matcher.find()) { 
                String g = matcher.group();                 
                // 原来的代码 if (isStartElement(g))){
                // 修改后的
                if (isStartElement(g) || (!isText(g) && !isEndElement(g) && "<id>".equalsIgnoreCase(g)) ) {  
                    if (isStartElement(prev)) { 
                        level++; 
                    } 
                    if (prev != null) { 
                        buffer.append("\n"); 
                    } 
                    buffer.append(indent(level) + g); 
                } else if (isText(g)) {
                ...... 
                }
            }


修正后打印结果如下:
<Msgtype>advertise</Msgtype>
<ID>idtest</ID>
<UserID>+8613912345678</UserID>
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics