项目代码:https://gitee.com/tanhuanpei88/merge_xml/tree/master/src
逻辑流程:使用的java合并xml
1、使用dom4j-2.1.3.jar 库 解析xml
public static Document getDocument(String path) throws DocumentException {
SAXReader reader = new SAXReader();
return reader.read(path);
}
public static List<Element> getElements(String path) throws DocumentException {
return getDocument(path).getRootElement().elements();
}
2、获取两个xml resources标签下的所有标签进行对比,然后再对应的母包public.xml位置插入需要合并的标签
/**
* 获取两个xml的所有标签
* 合并两个xml的标签(去除不必要标签)
* 插入相同的type标签位置
* @param path1
* @param path2
* @param tagName
*/
public Document mergeXml(String path1, String path2, String tagName) {
List<Element> list3 = new ArrayList<>();
List<Element> merageList = new ArrayList<>();
try {
List<Element> list1 = getElements(path1);
List<Element> list2 = getElements(path2);
merageList.addAll(list1);
//合并两个xml的标签(去除不必要标签)
for (Element element : list2) {
String name = element.attribute("name").getStringValue();
boolean isFind = false;
for (Element element2 : list1) {
String name2 = element2.attribute("name").getStringValue();
isFind = false;
if (name.equals(name2)) {
isFind = true;
break;
}
}
if (!isFind) {
String findName = element.attributeValue("name");
//去除一些不要的标签
if(!isContainName(findName)){
System.out.println("不同的标签:"+findName);
list3.add(element);
}
}
}
//插入相同的type标签位置
int index = 0 ;
for (int i = 0;i<list1.size() ;i++) {
Element element = list1.get(i);
String type = element.attribute("type").getStringValue();
Iterator iterator=list3.iterator();
while(iterator.hasNext()) {
Element element2=(Element) iterator.next();
String type2 = element2.attribute("type").getStringValue();
String findName = element2.attributeValue("name");
if(type.equals(type2)){
merageList.add(i + index,element2);
System.out.println("插入位置:"+i + index+ " 类型:"+type2+" 名称:"+findName );
index++;
iterator.remove();
}
}
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return createDocument(tagName, merageList);
}
3.当public.xml合并完对资源重新赋值(根据资源id生成的规则)
重新赋值的关键代码:
/**
* 创建xml 并且对资源重新赋值
* @param tagName
* @param list
* @return
*/
public Document createDocument(String tagName, List<Element> list) {
Document document = DocumentHelper.createDocument();
Element tagNameElement = document.addElement(tagName);
String temptType = "";
String tempId = "7f000000";
String elementId = "0x7f000000";
for (Element element : list) {
//获取type属性值
String typeName = element.attribute("type").getStringValue();
long idvalue;
//上一个值和当前值不一样 那就是新的type类型
if(!temptType.equals(typeName)){
tempId = "7f"+tempId.substring(2,4) +"0000";
idvalue = Integer.parseInt(tempId, 16);
tempId = Long.toHexString(65536 + idvalue);
elementId = "0x"+tempId;
}else{
idvalue = Integer.parseInt(tempId, 16);
tempId = Long.toHexString(1 + idvalue);
elementId = "0x"+tempId;
}
temptType = typeName;
tagNameElement.addElement("public")
.addAttribute("type",element.attributeValue("type"))
.addAttribute("name",element.attributeValue("name"))
.addAttribute("id",elementId);
}
return document;
}
5.输出文档的关键代码:
/* 输出xml文档
* @param doc 要输出的文档
* @param fileName 路径
*/
public void writeXML(Document doc, String fileName) {
try {
// 设置XML文档格式
OutputFormat outputFormat = OutputFormat.createPrettyPrint();
// 设置XML编码方式,即是用指定的编码方式保存XML文档到字符串(String),这里也可以指定为GBK或是ISO8859-1
outputFormat.setEncoding("UTF-8");
//outputFormat.setSuppressDeclaration(true); //是否生产xml头
outputFormat.setIndent(true); //设置是否缩进
outputFormat.setIndent(" "); //以四个空格方式实现缩进
outputFormat.setNewlines(true); //设置是否换行
XMLWriter writer = new XMLWriter(new FileWriter(fileName),outputFormat);
writer.write(doc);
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
运行:
//母包xml
String matrixPublic = "src/public/matrixPublic.xml";
//要被合并的xml
String channelPublic = "src/public/channelPublic.xml";
//输出的xml
final String publicPath = "src/public/public.xml";
PublicXML ux = new PublicXML();
Document doc=ux.mergeXml(matrixPublic, channelPublic, "resources");
ux.writeXML(doc, publicPath);