package com.dream.online.util;
import java.io.File;
import java.io.FileWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
/**
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
**/
public class XmlByDom4j {
/**
* 填充Xml模板
* @author
* @date 2017-04-19
* @param xmlFilePath XML模板path
* @param mapData 填充的数据
*/
public static void FillXmlByMapData(String xmlFilePath,String oldName,String newName,Map<String,String> mapData ){
try {
xmlFilePath = xmlFilePath+File.separator+oldName;
SAXReader reader = new SAXReader();
Document doc = reader.read(new File(xmlFilePath));
//得到xml文档根节点元素
Element root = doc.getRootElement();
//从根节点开始遍历所有节点
GetNodes(root,mapData);
// 创建输出格式(OutputFormat对象)
OutputFormat format = OutputFormat.createPrettyPrint();
///设置输出文件的编码,设置成当前服务器的编码
format.setEncoding(System.getProperty("file.encoding"));
XMLWriter writer = new XMLWriter(new FileWriter(new File(xmlFilePath.replace(oldName,newName))), format);
writer.write(doc);
writer.close();
}catch (Exception e) {
e.printStackTrace();
}
}
/**
* 从指定节点开始,递归遍历所有子节点 ,
* 并且根据节点名称填充相应的数据
* xml中采用{{key}} 标记取值
* @date 2017-04-19
* @author
* @param node 遍历的节点
* @param mapData 需要填充的数据map
*/
private static void GetNodes(Element node , Map<String,String> mapData){
List<Attribute> attributes = node.attributes();
for (Attribute attr:attributes ) {
String regex = "\\{\\{(.*)\\}\\}";
Pattern r = Pattern.compile(regex);
Matcher m = r.matcher(attr.getStringValue());
if(m.find()){
String key = m.group(1);
if(mapData.containsKey(key)){
attr.setValue(mapData.get(key));
}
}
}
//递归遍历当前节点所有的子节点
List<Element> listElement=node.elements();//所有一级子节点的list
for(Element e:listElement){//遍历所有一级子节点
GetNodes(e,mapData);//递归
}
}
public static void main(String[] args) {
//{{key}} 标记取值
Map<String,String> mapData = new HashMap<>();
XmlByDom4j.FillXmlByMapData("D:","CKKE310J.xml","CKKE310JNew.xml",mapData);
}
}