dom4j 应用组成
1、pom.xml
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.6</version>
</dependency>
2、直接使用
以微信公众号自动回复为例
@RequestMapping(value = "", method = RequestMethod.POST)
public String autoReply(HttpServletRequest request) throws Exception {
// <![CDATA[]]> 是为了规避 标签值里有标签符号的情况,一般情况可以忽略
String xml = "<xml><ToUserName><![CDATA[gh_3333333333333]]></ToUserName><FromUserName><![CDATA[***]]></FromUserName><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[86]]></Content></xml>";
// String xml = new String(ByteStreams.toByteArray(request.getInputStream()));
// 解析微信发来的XML字符串
SAXReader reader = new SAXReader();
Document document = reader.read(new ByteArrayInputStream(xml.getBytes("UTF-8")));
Element root = document.getRootElement();
String openId = root.selectSingleNode("/xml/FromUserName").getText();
String developer = root.selectSingleNode("/xml/ToUserName").getText();
String msgType = root.selectSingleNode("/xml/MsgType").getText();
// 给微信返回XML字符串
document = DocumentHelper.createDocument();
root = document.addElement("xml");
root.addElement("ToUserName").addText(openId);
root.addElement("FromUserName").addText(developer);
root.addElement("CreateTime").addText("" + System.currentTimeMillis());
root.addElement("MsgType").addText("text");
root.addElement("Content").addText("返回给用户的内容");
String responseXml = document.asXML();
return responseXml;
}
3、XML 与 Map 之间互相转换的工具类
public class XMLUtil {
public static void main(String[] args) throws Exception{
String xml = "<xml><ToUserName><![CDATA[gh_333333333333]]></ToUserName><FromUserName><![CDATA[3333333333333]]></FromUserName><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[86]]></Content></xml>";
// xml 转 Map
Map rootMap = XMLUtil.parseXml(xml);
Map topMap = (Map) rootMap.get("xml");
String openId = (String) topMap.get("FromUserName");
// 构造Map并转成xml
rootMap = new HashMap();
topMap = new HashMap();
topMap.put("ToUserName", openId);
rootMap.put("xml", topMap);
StringBuffer sb = new StringBuffer();
String responseStr = XMLUtil.parseMap(rootMap, sb);
}
public static Map<String, Object> parseXml(String xml) throws DocumentException {
Map map = new HashMap();
try {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new ByteArrayInputStream(xml.getBytes("UTF-8"))); //xml串第一行不能有空格,否则报错
Element root = document.getRootElement();//得到xml文档根节点元素,即最上层的"<xml>"
elementTomap(root, map);
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
public static Map<String, Object> elementTomap(Element outele, Map<String, Object> outmap) {
List<Element> list = outele.elements();
int size = list.size();
if (size == 0) {
outmap.put(outele.getName(), outele.getTextTrim());
} else {
Map<String, Object> innermap = new HashMap<String, Object>();
int i = 1;
for (Element ele1 : list) {
String eleName = ele1.getName();
String value = ele1.getText();
Object obj = innermap.get(eleName);
if (obj == null) {
elementTomap(ele1, innermap);
} else {
if (obj instanceof java.util.Map) {
List<Map<String, Object>> list1 = new ArrayList<Map<String, Object>>();
list1.add((Map<String, Object>) innermap.remove(eleName));
elementTomap(ele1, innermap);
list1.add((Map<String, Object>) innermap.remove(eleName));
innermap.put(eleName, list1);
} else if (obj instanceof String) {
innermap.put(eleName + i, value);
i++;
} else {
elementTomap(ele1, innermap);
Map<String, Object> listValue = (Map<String, Object>) innermap.get(eleName);
((List<Map<String, Object>>) obj).add(listValue);
innermap.put(eleName, obj);
}
}
}
outmap.put(outele.getName(), innermap);
}
return outmap;
}
public static String parseMap(Map<?, ?> map, StringBuffer sb) {
Set<?> set = map.keySet();
for (Iterator<?> it = set.iterator(); it.hasNext();) {
String key = (String) it.next();
Object value = map.get(key);
if (value instanceof HashMap) {
sb.append("<" + key + ">");
parseMap((HashMap<?, ?>) value, sb);
sb.append("</" + key + ">");
} else if (value instanceof ArrayList) {
List<?> list = (ArrayList<?>) map.get(key);
for (int i = 0; i < list.size(); i++) {
sb.append("<" + key + ">");
Map<?, ?> hm = (HashMap<?, ?>) list.get(i);
parseMap(hm, sb);
sb.append("</" + key + ">");
}
} else {
sb.append("<" + key + ">" + value + "</" + key + ">");
}
}
return sb.toString();
}
}
网友评论