import java.io.FileOutputStream;

import javax.swing.event.DocumentListener;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

//使用DOM方式对XML文档进行CRUD
public class Demo2 {
	
	//查询数据
	@Test
	public void read() throws Exception{
		//1:创建工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		
		//2:得到DOM解析器
		DocumentBuilder builder = factory.newDocumentBuilder();
		
		//3:解析XML文档,得到代表文档的document
		Document document = builder.parse("src/book.xml");
		
		NodeList list = document.getElementsByTagName("书名");
		Node node = list.item(1);
		String content = node.getTextContent();
		System.out.println(content);
	}
	
	//添加数据
	@Test
	public void add() throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document = builder.parse("src/book.xml");
		
		//创建节点
		Element price = document.createElement("售价");
		price.setTextContent("3.15元");

		//把创建的节点挂在第一本书上
		Element book =(Element) document.getElementsByTagName("书").item(0);
		book.appendChild(price);
		
		//把更新后内存写会到XML文档
		TransformerFactory tffactory = TransformerFactory.newInstance();
		Transformer tf = tffactory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
	}
	
	//向指定位置添加节点
	@Test
	public void add1() throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document = builder.parse("src/book.xml");
		
		//创建节点
		Element price = document.createElement("售价");
		price.setTextContent("5.25元");
		
		//得到参考节点
		Element refNode=(Element)document.getElementsByTagName("售价").item(0);
		
		//得到要挂载的节点
		Element book = (Element) document.getElementsByTagName("书").item(0);
		
		//往book节点的指定位置插入
		book.insertBefore(price, refNode);
		
		//把更新后内存写会到XML文档
		TransformerFactory tffactory = TransformerFactory.newInstance();
		Transformer tf = tffactory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
	}
	
	//向XML文档节点上添加属性
		@Test
		public void addattr() throws Exception{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document document = builder.parse("src/book.xml");
			
			//得到参考节点
			Element bookName=(Element)document.getElementsByTagName("书名");
			bookName.setAttribute("name", "XXXXX");
			
			//把更新后内存写会到XML文档
			TransformerFactory tffactory = TransformerFactory.newInstance();
			Transformer tf = tffactory.newTransformer();
			tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
		}
	
		//删除单个节点
		@Test
		public void delete() throws Exception{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document document = builder.parse("src/book.xml");
			
			//先得到要删除的节点
			Element delE = (Element) document.getElementsByTagName("售价").item(0);
			
			//得到要删除节点的爸爸
			Element book = (Element) document.getElementsByTagName("书").item(0);
			
			//爸爸删除
			book.removeChild(delE);
			
		}
		//删除全部节点
		@Test
		public void deleteAll() throws Exception{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document document = builder.parse("src/book.xml");
			
			//先得到要删除的节点
			Element book = (Element) document.getElementsByTagName("售价").item(0);
			book.getParentNode().getParentNode().getParentNode().removeChild(book.getParentNode().getParentNode());
		
			//把更新后内存写会到XML文档
			TransformerFactory tffactory = TransformerFactory.newInstance();
			Transformer tf = tffactory.newTransformer();
			tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));

		}
		
		//更新售价
		@Test
		public void update() throws Exception{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document document = builder.parse("src/book.xml");
			
			Element book = (Element) document.getElementsByTagName("售价").item(0);	
			book.setTextContent("105");
			
			//把更新后内存写会到XML文档
			TransformerFactory tffactory = TransformerFactory.newInstance();
			Transformer tf = tffactory.newTransformer();
			tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));

		}
}

书的XML

<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架>
	<书>
		<书名>Java培训</书名>
		<作者>张扬</作者>
		<售价>5.25元</售价>
	</书>

	<书>
		<书名>Java培训2</书名>
		<作者>张扬</作者>
		<售价>21.5</售价>
	</书>
</书架>