`
elicer
  • 浏览: 133655 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Soap Message Formator

阅读更多

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

} 

 

分享到:
评论
2 楼 jelver 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>
1 楼 itstarting 2009-11-26  
感觉就不是专门针对简单的SOAP消息了
对于XML-LIKE的文本,都能格式化

没试过

相关推荐

    Extract Soap Body From Soap Message

    - XML解析:由于SOAP消息是XML格式,可以使用XML解析库,如Python的`xml.etree.ElementTree`或Java的`javax.xml.soap.SOAPMessage`来解析整个SOAP消息,然后定位到Body节点。 - 正则表达式:对于简单的SOAP消息,...

    CXF处理不规则SOAP message(转)

    标题中的"CXF处理不规则SOAP message(转)"指出,这篇内容主要涉及的是Apache CXF框架在处理非标准或不规范的SOAP(简单对象访问协议)消息时的问题和解决方案。SOAP是Web服务的一种通信协议,用于交换结构化的、...

    cxf-soap内容解析、更改(助记)

    在解析SOAP内容时,CXF框架提供了一些关键组件和类,例如`SOAPMessage`和`SOAPBody`。`SOAPMessage`代表整个SOAP消息,而`SOAPBody`则包含了消息的主要业务逻辑数据。开发者可以使用这些对象来读取和操作SOAP消息的...

    拼接soap,判断soap是否连接成功,返回接口的信息,解析soap报文,解析后的soap转成实体

    在IT行业中,尤其是在Web服务开发领域,SOAP(Simple Object Access Protocol)是一种常见的用于交换结构化信息的协议。它基于XML,常用于实现分布式系统之间的通信。本教程将围绕标题和描述中的关键知识点展开,...

    Web 服务编程技巧和窍门: 手工创建的 SOAP 消息中命名空间的处理

    JAX-WS提供了丰富的API,如`javax.xml.soap`包中的`MessageFactory`、`SOAPMessage`、`SOAPPart`和`SOAPEnvelope`等类,用于构建和操作SOAP消息。 创建SOAP消息时,要处理命名空间,你需要: 1. 创建`SOAPMessage`...

    JAVA输出soap报文[参考].pdf

    例如,SOAPFactory类用于创建SOAPMessage对象,MessageFactory类用于创建SOAPMessage对象,SOAPEnvelope类用于表示SOAP报文的根元素,SOAPHeader类用于表示SOAP报文的头部,SOAPBody类用于表示SOAP报文的主体等。...

    java调用soap接口案例

    4. **发送SOAP请求**:创建完SOAP请求后,通过`SOAPConnectionFactory.createConnection()`获取`SOAPConnection`实例,然后使用`SOAPConnection.call(SOAPMessage request, String url)`方法将请求发送到指定的SOAP...

    利用jdk web服务api实现,这里使用基于 SOAP message 的 Web 服务

    标题中的“利用jdk web服务api实现,这里使用基于 SOAP message 的 Web 服务”指的是使用Java开发Web服务,特别是基于SOAP(Simple Object Access Protocol)的消息传递协议。SOAP是一种用于交换结构化和类型化信息...

    利用DOM4J解析SOAP的简单示例

    这可以通过`DocumentFactory.getInstance().build(new File("soap_message.xml"))`实现,其中"soap_message.xml"是SOAP消息的文件路径。 3. **获取Envelope元素**:在SOAP消息中,Envelope是最外层的元素,可以通过...

    java发送SOAP报文

    这通常涉及到读取SOAP请求模板(可能是一个XML文件或字符串),然后用`SOAPMessage.createMessage()`方法初始化。 2. **设置SOAP头部**:通过`SOAPHeader`对象来添加身份验证、安全令牌等信息。这可以通过`SOAP...

    金蝶调用Webservice接口-SOAP

    这里我们使用`SOAPMessage.class`作为消息类型,并设置模式为`Service.Mode.MESSAGE`,表示我们将处理整个SOAP消息。 ```java Dispatch&lt;SOAPMessage&gt; dispatch = service.createDispatch( new QName(ns, "sResAdd_...

    JAVA输出soap报文.pdf

    在 JAVA 中输出 SOAP 报文需要使用 javax.xml.soap 包中的类,主要包括 MessageFactory、SOAPMessage、SOAPPart、SOAPEnvelope、SOAPBody、SOAPHeader 等。 首先,需要使用 MessageFactory 创建一个 SOAPMessage ...

    Web Service SOAP Client set SOAP Header

    SOAPMessage message = context.getMessage(); SOAPEnvelope envelope = message.getSOAPPart().getEnvelope(); SOAPHeader header = envelope.getHeader(); if (header == null) { header = envelope.add...

    CXF打印SOAP报文,记录WebService日志

    ### CXF打印SOAP报文与记录WebService日志 在企业级应用开发中,尤其是涉及到服务端接口(如WebService)的设计与实现时,日志记录变得尤为重要。它不仅可以帮助开发者更好地理解系统运行状况、定位问题所在,还能...

    SOAP实例程序,实现Java发送SOAP信息.zip

    SOAPMessage soapMessage = messageFactory.createMessage(); SOAPPart soapPart = soapMessage.getSOAPPart(); SOAPEnvelope envelope = soapPart.getEnvelope(); SOAPBody soapBody = envelope.getBody(); ...

    soap1.1和soap1.2区别

    SOAP 1.1 和 SOAP 1.2 区别详解 SOAP(Simple Object Access Protocol)是一种基于 XML 的轻量级协议,用于在网络上进行数据交换。SOAP 1.1 和 SOAP 1.2 是两个不同的版本,它们之间存在一些关键的区别。 首先,从...

    apache.soap...jar包,soap 调用webservice核心包

    `SoapMessage`和`SoapPart`是处理整个SOAP消息的关键类,而`SoapAddress`和`SoapFault`则分别用于处理服务地址和错误信息。 接下来,`org.apache.soap.rpc`是SOAP RPC(Remote Procedure Call)模型的实现。RPC模式...

    java 调用soap

    SOAPMessage requestMsg = messageFactory.createMessage(); SOAPPart part = requestMsg.getSOAPPart(); SOAPEnvelope envelope = part.getEnvelope(); SOAPHeader header = envelope.getHeader(); SOAPBody body =...

    如何查看java代码编写的soap请求报文头信息

    3. `javax.xml.soap.SOAPMessage`: 表示完整的SOAP消息,包括SOAP头和SOAP体。 4. `javax.xml.soap.SOAPHeader`: 代表SOAP消息的头部,可以添加、删除或修改报文头项。 5. `javax.xml.soap.SOAPHeaderElement`: 用于...

Global site tag (gtag.js) - Google Analytics