package jaxp.dom;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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.junit.Test;
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;
public class DOMTest {
/**
* 使用jaxp (sun) 公司提供的jar对xml文档进行dom解析
* @throws ParserConfigurationException
* @throws ParserConfigurationException
* @throws IOException
* @throws SAXException
* @throws IOException
* @throws SAXException
*/
/*
<书架>
<书>
<书名>水浒传</书名>
<作者>吴承恩</作者>
<价格>12</价格>
</书>
<书>
<书名>三国演义</书名>
<作者>罗贯中</作者>
<价格>33</价格>
</书>
</书架>
*/
//要输出>水浒传<书名>水浒传</书名>
@Test
public void read1() throws ParserConfigurationException, SAXException, IOException{
//创建文档的工厂
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
//创建文档的建造者
DocumentBuilder builder=factory.newDocumentBuilder();
//得到内存中的DOM文档对象
Document document=builder.parse("src/book.xml");
NodeList list=document.getElementsByTagName("书名");
Node node=list.item(0);
System.out.println(node.getTextContent());
}
//递归的遍历 该文档有多少个标签
@Test
public void read2() throws ParserConfigurationException, SAXException, IOException{
//创建文档的工厂
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
//创建文档的建造者
DocumentBuilder builder=factory.newDocumentBuilder();
//得到内存中的DOM文档对象
Document document=builder.parse("src/book.xml");
Node root=document.getElementsByTagName("书").item(0);
list(root);
}
private void list(Node root) {
if(root!=null){
if(root instanceof Element){
System.out.println(root.getNodeName());
}
NodeList list1=root.getChildNodes();
for(int i=0;i<list1.getLength();i++){
Node child=list1.item(i);
list(child);
}
}
}
//如何读取一个属性的值
@Test
public void readAttribute() throws ParserConfigurationException, SAXException, IOException{
//创建文档的工厂
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
//创建文档的建造者
DocumentBuilder builder=factory.newDocumentBuilder();
//得到内存中的DOM文档对象
Document document=builder.parse("src/book.xml");
Element element=(Element)document.getElementsByTagName("书").item(0);
String name=element.getAttribute("name");
System.out.println(name);
}
//<价格>15</价格>加入到第一个节点的书中
@Test
public void add() throws ParserConfigurationException, SAXException, IOException, TransformerException{
//创建文档的工厂
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
//创建文档的建造者
DocumentBuilder builder=factory.newDocumentBuilder();
//得到内存中的DOM文档对象
Document document=builder.parse("src/book.xml");
//创建要加入的元素
Element element=document.createElement("价格");
element.setTextContent("15");
//将新创建的元素添加到它对应的父节点上
Element parent=(Element)document.getElementsByTagName("书").item(0);
parent.appendChild(element);
//将内存中已经改变的树结构,刷新到xml文档中
TransformerFactory transformFactory=TransformerFactory.newInstance();
Transformer transform=transformFactory.newTransformer();
transform.transform(new DOMSource(document) , new StreamResult(new File("src/book.xml")) );
}
//<价格>15</价格> 想文档中指定的位置进行插入
@Test
public void add1() throws ParserConfigurationException, SAXException, IOException, TransformerException{
//创建文档的工厂
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
//创建文档的建造者
DocumentBuilder builder=factory.newDocumentBuilder();
//得到内存中的DOM文档对象
Document document=builder.parse("src/book.xml");
//创建要加入的元素
Element element=document.createElement("价格");
element.setTextContent("15");
//将新创建的元素添加到它对应的父节点上
Node parent=document.getElementsByTagName("书").item(0);
Node before= document.getElementsByTagName("作者").item(0);
parent.insertBefore(element,before);
//将内存中已经改变的树结构,刷新到xml文档中
TransformerFactory transformFactory=TransformerFactory.newInstance();
Transformer transform=transformFactory.newTransformer();
transform.transform(new DOMSource(document) , new StreamResult(new File("src/book.xml")) );
}
//向xml文档中插入属性 <书名 name=“yy”>水浒传</书名>
@Test
public void addAttribute() throws ParserConfigurationException, SAXException, IOException, TransformerException{
//创建文档的工厂
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
//创建文档的建造者
DocumentBuilder builder=factory.newDocumentBuilder();
//得到内存中的DOM文档对象
Document document=builder.parse("src/book.xml");
Element element=(Element)document.getElementsByTagName("书名").item(0);
element.setAttribute("name", "yy");
//将内存中已经改变的树结构,刷新到xml文档中
TransformerFactory transformFactory=TransformerFactory.newInstance();
Transformer transform=transformFactory.newTransformer();
transform.transform(new DOMSource(document) , new StreamResult(new File("src/book.xml")) );
}
//<价格>15</价格> 将这个记录删除
@Test
public void delete() throws ParserConfigurationException, SAXException, IOException, TransformerException{
//创建文档的工厂
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
//创建文档的建造者
DocumentBuilder builder=factory.newDocumentBuilder();
//得到内存中的DOM文档对象
Document document=builder.parse("src/book.xml");
//得到要删除的节点
Node node=document.getElementsByTagName("价格").item(0);
//得到要删除节点的父节点
Node parentnode=node.getParentNode();
//使用父节点将孩子节点删除
parentnode.removeChild(node);
//将内存中已经改变的树结构,刷新到xml文档中
TransformerFactory transformFactory=TransformerFactory.newInstance();
Transformer transform=transformFactory.newTransformer();
transform.transform(new DOMSource(document) , new StreamResult(new File("src/book.xml")) );
}
//<价格>15</价格> 更新价格15 转变成109
@Test
public void update() throws ParserConfigurationException, SAXException, IOException, TransformerException{
//创建文档的工厂
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
//创建文档的建造者
DocumentBuilder builder=factory.newDocumentBuilder();
//得到内存中的DOM文档对象
Document document=builder.parse("src/book.xml");
Element element=(Element)document.getElementsByTagName("价格").item(0);
element.setTextContent("109");
//将内存中已经改变的树结构,刷新到xml文档中
TransformerFactory transformFactory=TransformerFactory.newInstance();
Transformer transform=transformFactory.newTransformer();
transform.transform(new DOMSource(document) , new StreamResult(new File("src/book.xml")) );
}
}