WebService响应报文转换为map(某些情况下)


转换webService响应报文为map

最近项目组有需求调用其他系统webService服务,由于对方没有提供wsdl文件,无法通过axios自动生成相应的代码,就只好手动写一个实际上为xml报文转换为map的方法(适用于对方返回报文硬拼的情况):

//首先格式化对方返回的报文结果
public static String formatXML(String unformatedXML) {
	if(StringUtils.isEmpty(unformatedXML)) {
		return "格式化XML入参为空!";
	}
	final Document document = parseXmlFile(unformatedXML);
	if (null == document) {
		return "解析XML失败!";
	}
	OutputFormat format = new OutputFormat(document);
	formate.setLineWidth(65);
	format.setIndent(2);
	Writer out = new StringWriter();
	XMLSerializer serializer = new XMLSerializer(out,format);
	try {
		serializer.serialize(document);
	} catch (IOException e) {
		e.printStackTrace();
	}
	return out.toString();
}

//parseXmlFile方法
private static Document parseXmlFile(String in) {
	DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
	try {
		DocumentBuilder db = dbf.newDocumentBuilder();
		InputSource is = new InputSource(new StringReader(in));
		return db.parse(is);
	} catch (ParserConfigurationException e) {
		e.printStackTrace();
	} catch (SAXException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

上述代码主要处理部分引用如下

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import com.sun.org.apache.xml.internal.serialize.OutputFormat;
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;

上述只是将接受来的报文转换为XML格式的内容,下列方法为实际执行方法:

public Map<String,Object> parseXmlFile(String in) {
	List<Map<String,Object>> resultList = new ArrayList<Map<String,Object>>();
	Map<String,Object> resultMap = new HashMap<String,Object>();
	try{
		Map<String,Object> tempMap = new HashMap<String,Object>();
		Document doc = DocumentHelper.parseText(in);
		Element root = doc.getRootElement();
		getCode(root,resultList);
		for(int i = 0; i < resultList.size(); i++) {
			tempMap = resultList.get(i);
			resultMap.putAll(tempMap);
		}
	} catch (DocumentException e) {
		e.printStackTrace();
	}
	return resultMap;
}

//getCode递归部分
public voice getCode(Element root, List<Map<String,Object>> resultList) {
	boolean flag = false;
	Map<String,Object> result = new HashMap<String,Object>();
	if(root.elements() != null) {
		List<Element> list = root.elements();
		for(Element e: list) {
			if(e.elements().size() > 0) {
				getCode(e,resultList);
			}
			if(e.elments().size() == 0) {
				flag = true;
				result.put(e.getName(), e.getText());
			}
		}
	}
	if(flag) {
		resultList.add(result);
		flag = false;
	}
}

使用递归将XML报文转换为Map。

示例

String ret = ........//此处为调用webService服务,返回的响应报文
Map<String,Object> resultMap = new HashMap<String,Object>();
resultMap = parseXmlFile(ret);

resultMap即为转换后的Map结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
webservice响应报文的格式通常是XML格式。XML是一种可扩展标记语言,用于描述数据的结构和内容。在webservice中,响应报文的格式遵循SOAP协议,SOAP是一种基于XML的通信协议,用于在网络上交换结构化信息。SOAP协议定义了报文的格式和通信规则,以确保不同平台和系统之间的互操作性。响应报文的格式包含在SOAP Envelope元素中,其中包含SOAP Header和SOAP Body两个部分。SOAP Header用于传递额外的信息和参数,而SOAP Body包含实际的响应数据。在SOAP Body中,响应数据被封装在特定的命名空间下的元素中。这些元素的结构和内容由webservice的定义确定,以便客户端可以解析和处理响应数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [WebService soap报文请求返回xml格式以及自定义soap模板](https://blog.csdn.net/zz18435842675/article/details/96869484)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [WebService soap报文请求与响应报文解析JAVA)](https://blog.csdn.net/qq_27256783/article/details/103660512)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值