在开发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;
}
}
分享到:
相关推荐
Extract Soap Body From Soap Message
NULL 博文链接:https://huiseyiyu.iteye.com/blog/1172161
例如,SOAPFactory类用于创建SOAPMessage对象,MessageFactory类用于创建SOAPMessage对象,SOAPEnvelope类用于表示SOAP报文的根元素,SOAPHeader类用于表示SOAP报文的头部,SOAPBody类用于表示SOAP报文的主体等。...
本人在网上看了很多都不能很好的解析报文,就算解析也很难使用,我上传的这个里面将可以拼接soap,判断soap是否连接成功,返回接口的信息,再将报文解析,再转成java实体使用
在 JAVA 中输出 SOAP 报文需要使用 javax.xml.soap 包中的类,主要包括 MessageFactory、SOAPMessage、SOAPPart、SOAPEnvelope、SOAPBody、SOAPHeader 等。 首先,需要使用 MessageFactory 创建一个 SOAPMessage ...
利用DOM4J解析SOAP中的各个元素的值,在SOAP消息的收发中可以有一点借鉴的地方
用于使用CXF打印SOAP报文,记录WebService日志~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
soap资料soap资料soap资料soap资料soap资料
DTD 是一种保证XML文档格式正确的有效方法,可以通过比较XML文档和DTD文件来看文档是否符合规范,元素和标签使用是否正确。一个DTD文 档包含:元素的定义规则,元素间关系的定义规则,元素可使用的属性,可使用的...
NULL 博文链接:https://huiseyiyu.iteye.com/blog/1180356
2. The SOAP Message Exchange Model 3. Relation to XML 4. SOAP Envelope 4.1.1 SOAP encodingStyle Attribute 4.1.2 Envelope Versioning Model 4.2 SOAP Header 4.2.1 Use of Header Attributes 4.2.2 ...
NULL 博文链接:https://java8988.iteye.com/blog/1180454
thinkphp内使用soap 把下载的soap解压放到ThinkPHP\Extend\Vendor目录下 名字是soap 调用方法: function test($url,$method,$data){ vendor('soap.class#nusoap'); //从soap目录导class.nusoap.php类文件 $...
在Web-service 调用SOAP 新增加SOAP的配置信息。用于验证用户信息。
soap 所需全部jar包,最全。全部自己找的!现在很难找了。
SOAP资料,介绍SOAP协议,想对Soap协议研究了就下了看看
支持java端 生成soap-ui的自定义报文,功能和soap-ui软件相似
Soap WebService 调试工具
Laravel开发-laravel-soap Soap 协议客户端 肥皂协议客户端