在开发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;
}
}
分享到:
相关推荐
- XML解析:由于SOAP消息是XML格式,可以使用XML解析库,如Python的`xml.etree.ElementTree`或Java的`javax.xml.soap.SOAPMessage`来解析整个SOAP消息,然后定位到Body节点。 - 正则表达式:对于简单的SOAP消息,...
标题中的"CXF处理不规则SOAP message(转)"指出,这篇内容主要涉及的是Apache CXF框架在处理非标准或不规范的SOAP(简单对象访问协议)消息时的问题和解决方案。SOAP是Web服务的一种通信协议,用于交换结构化的、...
在解析SOAP内容时,CXF框架提供了一些关键组件和类,例如`SOAPMessage`和`SOAPBody`。`SOAPMessage`代表整个SOAP消息,而`SOAPBody`则包含了消息的主要业务逻辑数据。开发者可以使用这些对象来读取和操作SOAP消息的...
在IT行业中,尤其是在Web服务开发领域,SOAP(Simple Object Access Protocol)是一种常见的用于交换结构化信息的协议。它基于XML,常用于实现分布式系统之间的通信。本教程将围绕标题和描述中的关键知识点展开,...
JAX-WS提供了丰富的API,如`javax.xml.soap`包中的`MessageFactory`、`SOAPMessage`、`SOAPPart`和`SOAPEnvelope`等类,用于构建和操作SOAP消息。 创建SOAP消息时,要处理命名空间,你需要: 1. 创建`SOAPMessage`...
例如,SOAPFactory类用于创建SOAPMessage对象,MessageFactory类用于创建SOAPMessage对象,SOAPEnvelope类用于表示SOAP报文的根元素,SOAPHeader类用于表示SOAP报文的头部,SOAPBody类用于表示SOAP报文的主体等。...
4. **发送SOAP请求**:创建完SOAP请求后,通过`SOAPConnectionFactory.createConnection()`获取`SOAPConnection`实例,然后使用`SOAPConnection.call(SOAPMessage request, String url)`方法将请求发送到指定的SOAP...
标题中的“利用jdk web服务api实现,这里使用基于 SOAP message 的 Web 服务”指的是使用Java开发Web服务,特别是基于SOAP(Simple Object Access Protocol)的消息传递协议。SOAP是一种用于交换结构化和类型化信息...
这可以通过`DocumentFactory.getInstance().build(new File("soap_message.xml"))`实现,其中"soap_message.xml"是SOAP消息的文件路径。 3. **获取Envelope元素**:在SOAP消息中,Envelope是最外层的元素,可以通过...
这通常涉及到读取SOAP请求模板(可能是一个XML文件或字符串),然后用`SOAPMessage.createMessage()`方法初始化。 2. **设置SOAP头部**:通过`SOAPHeader`对象来添加身份验证、安全令牌等信息。这可以通过`SOAP...
这里我们使用`SOAPMessage.class`作为消息类型,并设置模式为`Service.Mode.MESSAGE`,表示我们将处理整个SOAP消息。 ```java Dispatch<SOAPMessage> dispatch = service.createDispatch( new QName(ns, "sResAdd_...
在 JAVA 中输出 SOAP 报文需要使用 javax.xml.soap 包中的类,主要包括 MessageFactory、SOAPMessage、SOAPPart、SOAPEnvelope、SOAPBody、SOAPHeader 等。 首先,需要使用 MessageFactory 创建一个 SOAPMessage ...
SOAPMessage message = context.getMessage(); SOAPEnvelope envelope = message.getSOAPPart().getEnvelope(); SOAPHeader header = envelope.getHeader(); if (header == null) { header = envelope.add...
### CXF打印SOAP报文与记录WebService日志 在企业级应用开发中,尤其是涉及到服务端接口(如WebService)的设计与实现时,日志记录变得尤为重要。它不仅可以帮助开发者更好地理解系统运行状况、定位问题所在,还能...
SOAPMessage soapMessage = messageFactory.createMessage(); SOAPPart soapPart = soapMessage.getSOAPPart(); SOAPEnvelope envelope = soapPart.getEnvelope(); SOAPBody soapBody = envelope.getBody(); ...
SOAP 1.1 和 SOAP 1.2 区别详解 SOAP(Simple Object Access Protocol)是一种基于 XML 的轻量级协议,用于在网络上进行数据交换。SOAP 1.1 和 SOAP 1.2 是两个不同的版本,它们之间存在一些关键的区别。 首先,从...
`SoapMessage`和`SoapPart`是处理整个SOAP消息的关键类,而`SoapAddress`和`SoapFault`则分别用于处理服务地址和错误信息。 接下来,`org.apache.soap.rpc`是SOAP RPC(Remote Procedure Call)模型的实现。RPC模式...
SOAPMessage requestMsg = messageFactory.createMessage(); SOAPPart part = requestMsg.getSOAPPart(); SOAPEnvelope envelope = part.getEnvelope(); SOAPHeader header = envelope.getHeader(); SOAPBody body =...
3. `javax.xml.soap.SOAPMessage`: 表示完整的SOAP消息,包括SOAP头和SOAP体。 4. `javax.xml.soap.SOAPHeader`: 代表SOAP消息的头部,可以添加、删除或修改报文头项。 5. `javax.xml.soap.SOAPHeaderElement`: 用于...