同时读取两个XML文件,如果需要把一个XML 文件中的某个特定元素的内容插入到另外一个XML文件中时,要用importNode()方法,具体使用例子如下:
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.commons.lang.StringUtils;
import org.apache.tools.ant.Task;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
/*@author:duanqf*/
public class MergeBeanRefContext {
private static Element sourceRoot;
private static Element destRoot;
private static Document sourceDoc;
private static Document destDoc;
public static void merge(String sourceXmlPath, String destXmlPath, Task task) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
factory.setIgnoringElementContentWhitespace(true);
DocumentBuilder db = factory.newDocumentBuilder();
db.setEntityResolver(new EntityResolver() {
public InputSource resolveEntity(String publicId,
String systemId) throws SAXException, IOException {
if (publicId!=null && publicId
.equals("-//SPRING//DTD BEAN//EN")) {
return new InputSource(new ByteArrayInputStream(
"<?xml version='1.0' encoding='GBK'?>"
.getBytes()));
}
return null;
}
});
sourceDoc = db.parse(new File(sourceXmlPath));
sourceRoot = sourceDoc.getDocumentElement();
destDoc = db.parse(new File(destXmlPath));
destRoot = destDoc.getDocumentElement();
execute(sourceDoc, destDoc, sourceRoot, destRoot, destXmlPath, task);
} catch (Exception e) {
e.printStackTrace();
}
}
private static void execute(Document sourceDoc, Document destDoc,
Element sourceRoot, Element destRoot, String destXmlPath, Task task) {
Node constructorListNode = ParseXmlTools.selectSingleNode(
"/beans/bean[@id='qfContext']/constructor-arg/list",
destRoot);
NodeList destList = ParseXmlTools.selectNodes("value",
constructorListNode);
NodeList sourceList = ParseXmlTools.selectNodes(
"/beans/bean[@id='qfContext']/constructor-arg/list/value",
sourceRoot);
Map destPatternsMap = new HashMap();
for (int j = 0; j < destList.getLength(); j++) {
Node value = destList.item(j);
if (value != null) {
String valueStr = value.getTextContent();
if (StringUtils.isNotBlank(valueStr)) {
valueStr = valueStr.trim();
destPatternsMap.put(valueStr, value);
}
}
}
for (int j = 0; j < sourceList.getLength(); j++) {
Node value = sourceList.item(j);
if (value != null) {
String valueStr = value.getTextContent();
if (destPatternsMap.get(valueStr) == null) {
Node temp = destDoc.importNode(value, true);
constructorListNode.appendChild(temp);
// task.log("Add qfContext bean constructor-arg value:"
// + valueStr);
}
}
}
//ParseXmlTools.saveXml(destXmlPath, destDoc);
}