package com.itjob.xml;

import java.io.*;
import java.util.*;
import org.dom4j.*;
import org.dom4j.io.*;

/**
 * 第7章 Java XML编程
 * 考题：使用DOM4J解析技术对7.2.2章节中的students文件进行修改，将所有元素的student的show属性修改为no，并将student元素的phone子元素的值为13344445555的节点的整个student 节点删除，
 * 并输出到一个新的文件students2.xml中，注意不要出现中文乱码。
 * @author AmigoXie
 */
public class DOM4JModifyXml {

	public static void main(String[] args) {
		DOM4JModifyXml temp = new DOM4JModifyXml();
		temp.modiXMLFile("D:\\project\\questionbank\\students.xml",
					"D:\\project\\questionbank\\students2.xml");
	}

	/**
	 * 修改XML文件中内容,并另存为一个新文件
	 * 重点掌握dom4j中如何添加节点,修改节点,删除节点
	 * @param filename 修改对象文件 
	 * @param newfilename 修改后另存为该文件
	 * @return 返回操作结果, 0失败, 1成功
	 */
	public int modiXMLFile(String filename, String newfilename) {
		int returnValue = 0;
		try {
			SAXReader saxReader = new SAXReader();
			Document document = saxReader.read(new File(filename));
			// 修改内容之一: 如果student节点中show参数的内容为yes,则修改成no
			// 先用xpath查找对象
			List list = document.selectNodes("/students/student/@show");
			Iterator iter = list.iterator();
			while (iter.hasNext()) {
				Attribute attribute = (Attribute) iter.next();
				if (attribute.getValue().equals("yes")) {
					attribute.setValue("no");
				}
			}


			// 修改二: 若phone为13344445555，则删除该phone节点所在的整个student节点
			list = document.selectNodes("/students/student");
			iter = list.iterator();
			
			// 获得根元素
			Element rootElement = document.getRootElement();
			while (iter.hasNext()) {
				Element studentElement = (Element) iter.next();
				Iterator iterator = studentElement.elementIterator("phone");
				while (iterator.hasNext()) {
					Element phoneElement = (Element) iterator.next();
					if ("13344445555".equals(phoneElement.getText())) {
						rootElement.remove(studentElement);
					}
				}
			}
			
			// 将document中的内容写入文件中
	        OutputFormat format = OutputFormat.createPrettyPrint();
	        /** 指定XML字符集编码 */
	        format.setEncoding("GBK");
	        XMLWriter writer = new XMLWriter(new FileWriter(new File(newfilename)),format);
			writer.write(document);
			writer.close();
			returnValue = 1;
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return returnValue;
	}
}
