用来实现对紧邻的相同的标签元素的内容和两对标签之间的非标签内容进行合并

源文件:

<?xml version="1.0" encoding="UTF-8"?>

<Body>
	<Title>4月7日凌晨5时,近300名穿着“警察”制服</Title>
	<ReportTime type="absTime">2014年4月11日07:00</ReportTime>
	<Content>
		<Paragraph>
			<Sentence>
				<Event eid="e1" type="thoughtevent">
					据
					<Participant sid="s1">新华社</Participant>
					<Denoter did="e1">电</Denoter>
				</Event>
				<Event eid="e2">
					,
					<Time tid="t2">4月7日凌晨5时,</Time>
					<Time tid="t2">4月7日凌晨5时,</Time>
					近3
					<Time tid="t2">4月7日凌晨5时,</Time>
					00名穿着“警察”制服的不明身份人员与近百名社会人员持棍棒、器械,
					<Denoter did="e2">袭击</Denoter>
				</Event>
				<Event eid="e27">
					作案的
					<Participant sid="s27">甘肃永瑞房地产开发有限公司工作人员李某</Participant>
					、
					<Participant sid="s27">薛某</Participant>
					、
					<Participant sid="s27">张某</Participant>
					因
					<Denoter did="e27">涉嫌</Denoter>
				</Event>

			</Sentence>
		</Paragraph>
	</Content>
</Body>

合并之后的文件:

<?xml version="1.0" encoding="UTF-8"?>

<Body>
	<Title>4月7日凌晨5时,近300名穿着“警察”制服</Title>
	<ReportTime type="absTime">2014年4月11日07:00</ReportTime>
	<Content>
		<Paragraph>
			<Sentence>
				<Event eid="e1" type="thoughtevent">据
					<Participant sid="s1">新华社</Participant>
					<Denoter did="e1">电</Denoter>
				</Event>
				<Event eid="e2">,
					<Time tid="t2">4月7日凌晨5时,4月7日凌晨5时,近34月7日凌晨5时,</Time> 00名穿着“警察”制服的不明身份人员与近百名社会人员持棍棒、器械,
					<Denoter did="e2">袭击</Denoter>
				</Event>
				<Event eid="e27">作案的
					<Participant sid="s27">甘肃永瑞房地产开发有限公司工作人员李某、薛某、张某</Participant> 因
					<Denoter did="e27">涉嫌</Denoter>
				</Event>
			</Sentence>
		</Paragraph>
	</Content>
</Body>

具体实现代码如下:

package cn.edu.shu.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

import cn.edu.shu.experiment.util.PathsUtil;

/**
 *
 * <p>
 * ClassName MergeElementUtil
 * </p>
 * <p>
 * Description 用来实现对紧邻的相同的标签元素的内容和两对标签之间的非标签内容进行合并
 * </p>
 *
 * @author wangxu [email protected]
 *         <p>
 *         Date 2014年11月26日 下午6:43:44
 *         </p>
 * @version V1.0
 *
 */
public class MergeElementUtil {
	private static SAXReader saxReader;
	private static Document document;
	static String path = "test/aaaa.xml";

	// static String path = "test/101国道密云段现惨祸客车农用车相撞致6人亡.xml";

	public static void main(String[] args) {
		List<String> allFilePaths = PathsUtil.getAllFilePaths("autoAnnoText");
		for (String string : allFilePaths) {
			mergeByPath(string);
		}
	}

	public static void mergeByPath(String filePath) {
		saxReader = new SAXReader();
		try {
			document = saxReader.read(new FileInputStream(new File(filePath)));
		} catch (DocumentException | FileNotFoundException e) {
			e.printStackTrace();
		}
		// @SuppressWarnings("unchecked")
		List<Element> eventElements = document.selectNodes("//Sentence/Event");// 拿到所有的Event节点
		mergeElement(eventElements, "Time");// 合并紧邻的Time要素
		mergeElement(eventElements, "Location");// 合并紧邻的Location要素
		mergeElement(eventElements, "Participant");// 合并紧邻的Participant要素
		boolean writeToXML = WriteToXMLUtil.writeToXML(document, filePath);
		if (writeToXML)
			System.out.println("merge elements SUCCESS!");
		else
			System.out.println("merge elements Failed");
	}

	/**
	 *
	 * <p>
	 * Title: mergeElement
	 * </p>
	 * <p>
	 * Description: 该函数可以实现将两个紧邻的标签内容进行合并,也就是减少标签个数,比如<Time>a</Time><Time>b</Time>合并之后为<Time>ab</Time>
	 * </p>
	 *
	 * @param selectNodes
	 *            父节点列表集合
	 * @param nodeName
	 *            需要合并的要素名称
	 *
	 */
	private static void mergeElement(List<Element> selectNodes, String nodeName) {
		for (int outIndex = 0; outIndex < selectNodes.size(); outIndex++) {// 开始遍历所有的Event节点
			Element event_node = selectNodes.get(outIndex);
			List<Element> elements = event_node.elements(nodeName);// 获取指定的元素名称
			int size = elements.size();
			// 只有当size大于1的时候才进一步处理,size大于1,说明有多个同一要素的节点,才有继续的必要
			if (size > 1) {
				for (int i = 0; i < size; i++) {
					int nextIndex = i + 1;
					Element element = elements.get(i);
					String priorNodeName = element.getName().trim();
					String priorTimeValue = element.getTextTrim();// 拿到前一个节点的值
					// 开始判断,如果该节点之后紧跟着相同的标签,并且中间没有值的话,开始进行合并
					List<Node> textNodes = event_node.selectNodes("child::text()");// child::text()选取当前节点的所有文本子节点
					Node node = textNodes.get(nextIndex);// 注意,这个要取要素内容的下一个节点,才有判断的必要,如果此处用i的话,只能取到要素内容上面的不在标签之内的内容
					// System.out.println(node.getName());// 拿到的永远是null
					String nodeValue = node.getText().trim();// 拿到不属于标签之内的值,此处有一个注意点,如果该值前面有空行,那么拿到的永远都是空,否则可以取得该值
					int length = nodeValue != null ? nodeValue.length() : 0;
					String nextNodeName = null;
					String nextTimeValue = null;
					if ((nextIndex) < size) {
						Element tempEle = elements.get(nextIndex);
						nextNodeName = tempEle.getName().trim();
						nextTimeValue = tempEle.getTextTrim();
					}
					System.out.println("nodeValue = " + nodeValue);
					// 只要length小于等于2,并且两个标签名称相同,才可以认为两个标签的内容可以合并
					if (length <= 2 && priorNodeName.equals(nextNodeName)) {
						System.out.println("匹配成功!");
						// 那么需要将三部分的值内容拼接到一起,并且删除后面一个标签
						String totalValue = priorTimeValue + nodeValue + nextTimeValue;
						System.out.println("拼接之后的结果:" + totalValue);
						// 重新设置前一个标签的内容
						element.setText(totalValue);
						Element remove = elements.remove(nextIndex);// 移除后一个,注意重新置size,重新循环,这句话是移除标签及标签之内的内容
						System.out.println("remove掉的值是 = " + remove.getStringValue());
						boolean removeFlag = elements.remove(node);// 这句话是移除标签之外的内容,即便移除成功,返回值依然是false,因为该值不在标签之内,所以不认为是一个元素,那么只有移除一个元素的时候,返回值才为true
						System.out.println("removeFlag = " + removeFlag);
						size = elements.size();
						i = -1;// 重新从头开始遍历
					}
					// System.out.println(document.asXML());
				}
			}
		}
	}

}
时间: 2024-12-17 07:57:14

用来实现对紧邻的相同的标签元素的内容和两对标签之间的非标签内容进行合并的相关文章

java_web学习(15)jQuery

JavaScript 库作用及对比 为了简化 JavaScript 的开发, 一些 JavsScript 库诞生了. JavaScript 库封装了很多预定义的对象和实用函数.能帮助使用者建立有高难度交互的 Web2.0 特性的富客户端页面, 并且兼容各大浏览器. jQuery jQuery 是继 Prototype 之后又一个优秀的 JavaScript 库.jQuery 理念: 写得少, 做得多. 优势如下: 1>轻量级 2>强大的选择器 3>出色的 DOM 操作的封装 4>可

Oct 28th

jQuery 1.下载jQuery文件库 在jQuery的官方网站(http://jquery.com)中,下载最新版本的jQuery文件库.在网站中找到最新版本文件的下载按钮,将jQuery框架文件下载到本地即可,本教案使用的版本为稳定版:1.9.0版. 2.引入jQuery文件库 下载完jQuery框架文件后,并不需要任何的安装,仅需要使用<script>文件导入标记,将jQuery框架文件导入页面中即可,假设该文件下载后保存在项目文件夹Jscript中,那么,在页面的<head&g

JQuery————基础&amp;&amp;基础选择器

环境搭建 搭建一个jQuery的开发环境非常方便,可以通过下列几个步骤进行. 下载jQuery文件库 在jQuery的官方网站(http://jquery.com)中,下载最新版本的jQuery文件库.在网站中找到最新版本文件的下载按钮,将jQuery框架文件下载到本地即可,本教案使用的版本为稳定版:1.9.0版. 引入jQuery文件库 下载完jQuery框架文件后,并不需要任何的安装,仅需要使用<script>文件导入标记,将jQuery框架文件导入页面中即可,假设该文件下载后保存在项目文

Vim命令合集

来源:Vim命令合集 命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filename 打开vim并创建名为filename的文件 文件命令 打开单个文件 vim file 同时打开多个文件 vim file1 file2 file3 ... 在vim窗口中打开一个新文件 :open file 在新窗口中打开文件 :split file 切换到下一个文件 :bn 切换到上一

dom中一些节点获取和增改

1获取标签里的文本对象: 对象.innerText 获取标签里的文本内容     早期的火狐浏览器中是不支持的 赋值会输出转义后的内容 对象.innerHTML 获取标签里的所有内容 赋值会输出原样 都兼容 对象.textContent 获取标签里的文本内容   IE8之前包括ie8不支持  2 自定义属性 自定义属性 js无法通过点的方式获得 对象.getAttribute("属性名")  得到自定义属性对象 对象.setAttribute("属性名",”属性值“

[转载]VIM命令合集

Vim命令合集 http://www.cnblogs.com/softwaretesting/archive/2011/07/12/2104435.html 命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filename 打开vim并创建名为filename的文件 文件命令 打开单个文件 vim file 同时打开多个文件 vim file1 file2 file3 ..

树和二叉树

以下的内容做为学习笔记,复制别人的,感觉总结的比较好: 第5章 树和二叉树 本章中主要介绍下列内容:  1.树的定义和存储结构  2.二叉树的定义.性质.存储结构  3.二叉树的遍历.线索算法  4.树和二叉树的转换  5.哈夫曼树及其应用课时分配:     1.2两个学时,3四个学时,4两个学时, 5两个学时,上机两个学时重点.难点:     二叉树的遍历.线索算法.哈夫曼树及其应用 第一节 树 1.树的定义和基本运算1.1 定义    树是一种常用的非线性结构.我们可以这样定义:树是n(n≥

小生总结:新手必看的jQuery参考手册主要API

本文整理了一些主要的jQuery API,其中包括jQuery 核心函数和方法.jQuery属性参考手册.jQuery CSS操作.jQuery选择器.jQuery文档操作.jQuery筛选操作.jQuery事件方法.jQuery效果.jQuery Ajax操作.jQuery工具函数.jQuery事件对象.jQuery延迟对象.jQuery回调函数,欢迎收藏使用. jquery核心函数 函数                                 描述 jQuery()    这个函数接

C++之指针

C++中指针是一个很让人头疼的东西,指针指向这儿指向那儿很容易把人搞晕了.指针实现了对象的间接访问,指针本身也是对象这点和引用不同,引用仅仅是对象的别名.指针可以在其生命周期内指向不同的对象(当然除了指针常量),另外指针无需在定义时赋值,指针也可以为空指针或者无效指针. 常用的定义方法如下: int a=10; Int *b=&a;//运用取地址运算符 注意:引用不是对象,没有实际的地址,所以没有指向引用的指针! 指针的值类型: 1.指向了一个对象: 2.指向紧邻对象所占空间的下一个位置: 3.