在开发过程中经常遇到系统集成的开发需求,有的接口采用的是xml传参,或者是返回个xml,这个时候就需要去解析这个xml。以下提供一下如何传参和如何解析xml返回值的思路。首先xml传参分为固定格式和动态拼接xml传参
1.固定格式xml传参
1.首先定义一个String或者StringBuilder都可以,把固定格式的xml复制进去,动态拼接参数即可。
2.创建请求,格式定义为 application/xml.
代码实例如下
String message = "<?xml version="1.0" encoding='UTF-8'?>
<voucher>
<voucher_head>
<pk_voucher>"+参数变量+"</pk_voucher>
<pk_vouchertype>03</pk_vouchertype>
<year>2023</year>
</voucher_head>
<voucher>"
OkHttpClient okHttpClient = new OkHttpClient();
// 创建请求体
RequestBody requestBody = RequestBody.create(MediaType.parse("application/xml"),String.valueOf(message));
// 创建请求对象
Request request = new Request.Builder()
.url("")
.post(requestBody)
.build();
String resultNum = "";
try {
// 执行请求
Response response = okHttpClient.newCall(request).execute();
// 处理响应
if (response.isSuccessful()) {
String xmlResponse = response.body().string();
} else {
System.out.println("请求失败: " + response.code() + " " + response.message());
}
// 关闭响应流
response.close();
} catch (Exception e) {
e.printStackTrace();
}
2.动态拼接xml传参
key填写标签名 value填写值。按照需求动态去拼接
Document document = DocumentHelper.createDocument();
Element rootElement = document.addElement("key").setText("value");
最后提供个工具类 xml转String 和String转xml
/**
* 将Document对象转换为字符串
*
* @param document
* @return
* @throws Exception
*/
public static String convertDocumentToString(Document document) throws Exception {
OutputFormat format = OutputFormat.createPrettyPrint();
format.setSuppressDeclaration(true);
StringWriter sw = new StringWriter();
XMLWriter xw = new XMLWriter(sw, format);
xw.write(document);
xw.flush();
xw.close();
return sw.toString();
}
/**
* String 转 org.dom4j.Document
*
* @param xml
* @return
* @throws DocumentException
*/
private static Document strToDocument(String xml) throws DocumentException {
return DocumentHelper.parseText(xml);
}
public static JSONObject documentToJSONObject(String xml) {
JSONObject jsonObject = null;
try {
jsonObject = elementToJSONObject(strToDocument(xml).getRootElement());
} catch (DocumentException e) {
e.printStackTrace();
} finally {
return jsonObject;
}
}
/**
* org.dom4j.Element 转 com.alibaba.fastjson.JSONObject
*
* @param node
* @return
*/
public static JSONObject elementToJSONObject(Element node) {
JSONObject result = new JSONObject();
// 当前节点的名称、文本内容和属性
List<Attribute> listAttr = node.attributes();// 当前节点的所有属性的list
for (Attribute attr : listAttr) {// 遍历当前节点的所有属性
result.put(attr.getName(), attr.getValue());
}
// 递归遍历当前节点所有的子节点
List<Element> listElement = node.elements();// 所有一级子节点的list
if (!listElement.isEmpty()) {
for (Element e : listElement) {// 遍历所有一级子节点
if (e.attributes().isEmpty() && e.elements().isEmpty()) // 判断一级节点是否有属性和子节点
result.put(e.getName(), e.getTextTrim());// 沒有则将当前节点作为上级节点的属性对待
else {
if (!result.containsKey(e.getName())) // 判断父节点是否存在该一级节点名称的属性
result.put(e.getName(), new JSONArray());// 没有则创建
((JSONArray) result.get(e.getName())).add(elementToJSONObject(e));// 将该一级节点放入该节点名称的属性对应的值中
}
}
}
return result;
}