w3c dom操作Xml时从加入另一个XML文件的一个元素

同时读取两个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);
	}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值