1. XML Utils 类:
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Namespace;
import org.dom4j.QName;
import org.dom4j.XPath;
import org.springframework.stereotype.Component;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
@Component
public class XmlUtils {
/** 通过xml模板生产报文字符串 UTF-8 **/
public String genrateMsgFromXml(Map<String, String> content,String templateFileName) throws IOException,TemplateException{
String templatePath = "/templetes/"; // 报文模板路径
String requestXml = ""; // 请求报文
Configuration config = new Configuration(Configuration.VERSION_2_3_26) ;
config.setClassForTemplateLoading(this.getClass(), "/");
Template template = config.getTemplate(templatePath + templateFileName, "UTF-8");
requestXml = FreeMarkerTemplateUtils.processTemplateIntoString(template, content);
if (requestXml == null || "".equals(requestXml)) {
return null;
}
// 返回报文字符串
return requestXml;
}
/**
* 解析通知收到的xml,封装到map
*
* @param xml
* @return
* @throws Exception
*/
public static Map parseXML(String xml, String path) throws Exception {
Document doc = null;
Map map = new HashMap();
doc = DocumentHelper.parseText(xml);
Element eRoot = doc.getRootElement();
List<Element> eList = eRoot.selectNodes(path);
for (Element ele : eList) {
map.put(ele.getName(), ele.getTextTrim());
}
if (map.isEmpty()) {
throw new Exception("解析通知xml错误!");
}
return map;
}
/**
*解析带名称空间的xml
*
* @param xml
* @param path:传入格式为("ns:/节点名称") 如:"ns:UPS/ns:Request/ns:TxInfo" 符合xpath表达式
* @return
* @throws Exception
*/
public static Map parseXMLWithName(String xml, String path)
throws Exception {
Document document = DocumentHelper.parseText(xml);
String uri = document.getRootElement().getNamespaceURI();
Map<String, String> map = new HashMap<String, String>();
map.put("ns", uri);
XPath xpath = document.createXPath(path);
xpath.setNamespaceURIs(map);
Element el = (Element) xpath.selectNodes(document).get(0);
List<Element> list = el.elements();
Map newMap = new HashMap();
for (Element element : list) {
newMap.put(element.getName(), element.getTextTrim());
// System.out.println(element.getText());
}
if(newMap ==null){
throw new Exception("解析通知xml错误!");
}
return newMap;
}
public static void main(String[] args) {
String xml ="<?xml version=\"1.0\" encoding=\"utf-8\"?><request><requestid>访问者id</requestid><pageactionin>" +
"<currentpagenum>当前页码</currentpagenum><rowsperpage>每页行数</rowsperpage> <pageaction>翻页动作</pageaction><topagenum>翻到哪一页</topagenum></pageactionin>" +
"<retrieveargs><hospitalid>医院代号</hospitalid><deptcode>科室代号</deptcode></retrieveargs></request>";
try {
Map map=XmlUtils.parseXML(xml, "\request");
System.out.println(map);
} catch (Exception e) {
e.printStackTrace();
}
}
}
2. 在resources 下 配置 xml模板
3. 在代码中 填充xml数据
总结:使用xml模板 不用花很多时间去拼接 xml字符串。