package com.zjx.dom;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/*
*DOM解析XML文件
*/
public class DOM {
//命名一个Document文件用来中转文件
static Document doc=null;
//通过DocumentBuilderFactory解析得到xml文件
public static void getDOM() {
try {
// 获得DocumentBuilderFactory工场对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 通过工场创建解析器
DocumentBuilder db=factory.newDocumentBuilder();
// 通过解析器获得XML文件
doc = db.parse("books.xml");
} catch (ParserConfigurationException | SAXException | IOException e) {
e.printStackTrace();
}
}
//保存文件方法,一般通过TransformerFactory转换工场进行转换为所需要的格式
//设置保存格式,保存为我们需要的文件格式
public static void saveDOM() throws TransformerConfigurationException {
try {
// 获得TransformerFactory转换工场
TransformerFactory tff = TransformerFactory.newInstance();
// 通过工场创建转换器
Transformer tf = tff.newTransformer();
// 设定转换格式
tf.setParameter(OutputKeys.ENCODING, "UTF-8");
// 在cpu中找出doc文件
DOMSource source = new DOMSource(doc);
// 执行保存路径,如果保存路径和原来路径一样,覆盖原来文件
StreamResult srl = new StreamResult(new FileOutputStream("books.xml"));
// 保存
tf.transform(source, srl);
} catch (FileNotFoundException | TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//向xml文件中添加元素
public void addXML() throws TransformerConfigurationException {
// 使用DOM添加元素的方法,添加文件的五个元素
Element book = doc.createElement("book");
Element name = doc.createElement("name");
Element zuozhe = doc.createElement("zuozhe");
Element zyrw = doc.createElement("zyrw");
Element guojia = doc.createElement("guojia");
// 给name/zuozhe/zyrw/guojia元素赋值
name.setTextContent("三国演义");
zuozhe.setTextContent("罗贯中");
zyrw.setTextContent("赵子龙");
guojia.setTextContent("China");
// 想节点中插入元素
book.appendChild(name);
book.appendChild(zuozhe);
book.appendChild(zyrw);
book.appendChild(guojia);
// 将节点插入
doc.getElementsByTagName("books").item(0).appendChild(book);
// 保存文件
saveDOM();
System.out.println("保存成功!");
}
//删除没某个节点
public void delDOM(String name) throws Exception{
//获得书名元素集合
NodeList nodeList = doc.getElementsByTagName("name");
//通过nodelist集合遍历
for (int i = 0; i < nodeList.getLength(); i++) {
//获取每一个book节点
Node itembook = nodeList.item(i);
if (itembook.getTextContent().equals(name)) {
//返回父节点,删除自身
itembook.getParentNode().getParentNode().removeChild(itembook.getParentNode());
break;
}
}
saveDOM();
System.out.println("删除成功!");
}
//查看XML文件
public void findallDOM(){
NodeList name = doc.getElementsByTagName("name");
NodeList zuozhe= doc.getElementsByTagName("zuozhe");
NodeList zyrw = doc.getElementsByTagName("zyrw");
NodeList guojia = doc.getElementsByTagName("guojia");
System.out.println("书名\t\t作者\t\t主要人物\t\t国家");
for (int i = 0; i < name.getLength(); i++) {
Node bname = name.item(i);
Node bzuozhe = zuozhe.item(i);
Node bzyrw = zyrw.item(i);
Node bguojia = guojia.item(i);
System.out.println(bname.getTextContent()+"\t\t"+bzuozhe.getTextContent()+"\t\t"+bzyrw.getTextContent()+"\t\t"+bguojia.getTextContent());
}
}
//修改文件内容
public void updataDOM(String name,String value) throws Exception{
//获得书名元素集合
NodeList name1 = doc.getElementsByTagName("name");
NodeList zyrw = doc.getElementsByTagName("zyrw");
//通过name1遍历
for (int i = 0; i < name1.getLength(); i++) {
//获取第i个book节点
Node bname = name1.item(i);
Node bzyrw = zyrw.item(i);
if (bname.getTextContent().equals(name)) {
//通过bzyrw修改自身为value
bzyrw.setTextContent(value);
break;
}
}
saveDOM();
System.out.println("查看成功!");
}
public static void main(String[] args) throws Exception {
DOM dom = new DOM();
getDOM();
// dom.addXML();
// dom.delDOM("千与千寻");
// dom.findallDOM();
dom.updataDOM("虎胆龙威", "史泰龙");
}
}