java多个xml文件合并
例如:有2个xml文件。 a.xml和b.xml 把b.xml和a对比,如果相同则不覆盖如果不同,则吧不同的复制过去形成新的a.xml文件
a.xml:
<conf>
<performance>CPU_USED_PERCENT</performance>
<evtConf>
<evt col="DVC_NAME" id="A" key="DVC_NAME" name="设备名称"/>
<evt col="DVC_TYPE" id="b" key="DVC_TYPE" name="设备类型"/>
</evtConf>
<collect>
<dev ip="10.1.128.53" isOnsite="true" type="FW">
<dvc_att key="checked"/>
<att>
<attention name="H" value="0"/>
<attention name="I" value="0"/>
<attention name="L" value="0"/>
</dev>
</collect>
</conf>
b.xml
<conf>
<performance>CPU_USED_PERCENT</performance>
<evtConf>
<evt col="DVC_NAME" id="A" key="DVC_NAME" name="设备名称"/>
<evt col="DVC_TYPE" id="b" key="DVC_TYPE" name="设备类型"/>
</evtConf>
<collect>
<dev ip="10.1.128.225" isOnsite="true" type="FW">
<dvc_att key="checked"/>
<att>
<attention name="H" value="0"/>
<attention name="I" value="0"/>
<attention name="L" value="0"/>
</dev>
</collect>
</conf>
最后合并成这样的:
<conf>
<performance>CPU_USED_PERCENT</performance>
<evtConf>
<evt col="DVC_NAME" id="A" key="DVC_NAME" name="设备名称"/>
<evt col="DVC_TYPE" id="b" key="DVC_TYPE" name="设备类型"/>
</evtConf>
<collect>
<dev ip="10.1.128.53" isOnsite="true" type="FW">
<dvc_att key="checked"/>
<att>
<attention name="H" value="0"/>
<attention name="I" value="0"/>
<attention name="L" value="0"/>
</dev>
<dev ip="10.1.128.225" isOnsite="true" type="FW">
<dvc_att key="checked"/>
<att>
<attention name="H" value="0"/>
<attention name="I" value="0"/>
<attention name="L" value="0"/>
</dev>
</collect>
</conf>
求高手给思路,最好能有代码说明下,万分感谢!!
[解决办法]
需求没说清楚啊,通常粗略看过去很容易就认为/conf/collect/dev/@ip不想等,则其父节点计为新节点,需要合并!
但是如果IP相等呢?那用A的还是用B的?
所谓重复,只针对/conf/collect/dev节点而言me?evtConf之类的节点不做重复判断?两个都有同名节点时,以谁为准?
不管需求是怎样的,我给你提个思路吧:dom4j+jaxen,通过xpath来完成
首先检索b.xml种的所有/conf/collect/dev,依次迭代所有@ip,然后依次从a.xml中删除/conf/collect/dev[@ip='b.xml中的每个ip'],最后一次性向a.xml的/conf/collect添加所有b.xml中的所有/conf/collect/dev!
[解决办法]
dom4j+jaxen
public static void main(String...args) throws Exception{
SAXReader saxReader=new SAXReader();
Document a=saxReader.read(new File("a.xml"));
Document b=saxReader.read(new File("b.xml"));
List<Element> elements=b.selectNodes("/conf/collect/dev");
Element parent=(Element)a.selectSingleNode("/conf/collect");
for(Element element:elements){
String ip=element.attributeValue("ip");
Element old=(Element)a.selectSingleNode("/conf/collect/dev[@ip='"+ip+"']");
if(old!=null) parent.remove(old);
parent.add(element.detach());
}
System.out.println(a.asXML());
}
在你进一步提出你更详细的需求细节时,先考虑以下两点:
1:定义出你所谓的“如果相同”,何为相同?两个xml中同路径的dev节点名相同算相同么?还是其属性ip相同才算?还是更多的属性需要相同?或者所有属性要求相同,还是连同其子元素及其子孙元素及其属性相同才算相同?
2:如果不同是不是直接添加?如果相同是直接摘除原来的挂上新的?还是要一层层打开子元素挨个判断?如果依次迭代判断又需要再次定义其子孙元素的“如果相同”。