转换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结果