<span style="font-size:14px;">package com.rj.xml;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
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.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
//使用dom方式对xml文档进行crud
public class Demo01 {
//读取xml文档中: <书名>javascript就业培训教程</书名> 节点的值
@Test
public void read1() throws Exception{
//1.创建工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//2.得到dom解析器
DocumentBuilder builder = factory.newDocumentBuilder();
//解析xml文档,得到代表文档的document对象
Document document = builder.parse("src/book.xml");
NodeList nodeList = document.getElementsByTagName("书名");//通过书名,查找所有书名的节点,即元素
Node node = nodeList.item(1); //返回集合中的第 index 个项。
String content = node.getTextContent();//返回节点中内容
System.out.println(content);
}
/*
* dom解析下,xml文档的每一个组成部分都会用一个对象表示,例如标签用Element,属性用Attr,
* 但不管什么对象,都是Node的子类,所以在开发中可以把获取到的任意结点都当作Node对待.
* */
//得到xml中的所有标签
@Test
public void read2() throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");
//得到根节点
NodeList nodeList = document.getElementsByTagName("书架");
Node root = nodeList.item(0);
//或者直接 document.getElementsByTagName("书架").item(0);
list(root);//递归过去所有节点
}
private void list(Node node) {
if(node instanceof Element){
System.out.println(node.getNodeName());
}
NodeList list = node.getChildNodes();//获取此结点下一层的所有结点,包括空格
// System.out.println(list.getLength());
for(int i=0;i<list.getLength();i++){
Node child = list.item(i);
list(child);
}
}
//得到xml中文档属性的值: <书名 name="xxx">java就业培训教程</书名>
@Test
public void read3() throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");
/*
Node node = document.getElementsByTagName("书名").item(0);
NamedNodeMap namedNodeMap = node.getAttributes();
System.out.println(namedNodeMap.getNamedItem("name").getTextContent());
当NamedNodeMap有多个的时候遍历比较麻烦,因此从他的子类Element这个类中找方法直接获取值
*/
Element bookname = (Element) document.getElementsByTagName("书名").item(0);
String value = bookname.getAttribute("name");
System.out.println(value);
}
//向xml中添加节点:第一本书中添加 <售价>50.0元</售价>
@Test
public void add01() throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");
/*
* 插入这个数据,先获取他的上一层的节点,利用他的节点,插入
* 创建节点时候,先创建再填充内容
* */
//创建节点
Element price = document.createElement("售价");
price.setTextContent("50.0元");
//把创建的节点挂到第一本书上
Element book = (Element) document.getElementsByTagName("书").item(0);
book.appendChild(price);
/*
* 更新xml文档
* javax.xml.transform包中的Tranformer类用于把代表XML文件的Document对象转换为某种格式后进行输出
* 例如:把xml文件应用样式表后转成一个html文档,利用这个对象,当然也可以把Document对象由重新写入一个XML文件中。
*
* Tranformer类通过transform方法完成转化操作,该方法接收一个源和一个目的地.
* 我们可以通过:
* javax.xml.transform.dom.DOMSource类来关联要转换的document对象
* 用javax.xml.transform.stream.StreamResult对象来表示数据的目的地
*
* Tranformer对象通过TransformFactory获得
*
* */
/*
* Transformer获取,用工厂类TransformerFactory中的静态方法--
* static TransformerFactory newInstance()
获取 TransformerFactory 的新实例。
TransformerFactory中的方法:得到Transformer对象
abstract Transformer newTransformer()
创建执行从 Source 到 Result 的复制的新 Transformer。
* Transformer抽象类里面有这样一个方法
* abstract void transform(Source xmlSource, Result outputTarget)
* 将 XML Source 转换为 Result。
*
* 怎么通过Source的对象获取document对象-->Source的接口实现类DOMSource的构造方法
* DOMSource(Node n)
创建带有 DOM 节点的新输入源。
*
* Result的接口实现类StreamResult中的构造方法:
* StreamResult(OutputStream outputStream)
从字节流构造 StreamResult。
* */
//更新后内存写回到xml文档中
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml"))) ;
}
//在指定位置插入元素 <售价>36.2元</售价>节点之前
@Test
public void add02() throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");
//创建节点
Element price = document.createElement("售价");
price.setTextContent("59.9元");
//得到参考节点
Element refNode = (Element) document.getElementsByTagName("售价").item(0);
//得到要挂崽的节点,即参考节点的上一层的节点
Element book = (Element) document.getElementsByTagName("书").item(0);
//往book的指定位置插崽,即插入参考节点
book.insertBefore(price,refNode);
//更新xml
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
}
//向xml文档中添加属性: <书名>java就业培训教程</书名>--> name="xxx"
@Test
public void addAttr() throws Exception{
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");
Element bookname = (Element) document.getElementsByTagName("书名").item(0);
bookname.setAttribute("name", "xxx");
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
}
//删除第一个书名节点的售价:<售价>36.2元</售价>
@Test
public void delete1() throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");
//得到要删除的节点
Element e = (Element) document.getElementsByTagName("售价").item(0);
//得到要删除节点的爸爸
Element book = (Element) document.getElementsByTagName("书").item(0);
//爸爸想删除
book.removeChild(e);
//更新结果集
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
}
//删除 <售价>36.2元</售价>的父亲节点
@Test
public void delete2() throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");
//得到要删除的节点
//e.getParentNode()-->获取此节点的父亲节点
Element e = (Element) document.getElementsByTagName("售价").item(0);
e.getParentNode().getParentNode().removeChild(e.getParentNode());
//删除所有节点
//记住根节点的爸爸是document
//e.getParentNode().getParentNode().getParentNode().removeChild(e.getParentNode().getParentNode());
//更新结果集
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
}
//跟新售价 <售价>36.2元</售价>-->100元
@Test
public void update() throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");
Element e = (Element) document.getElementsByTagName("售价").item(0);
e.setTextContent("100元");
//更新结果集
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
}
}
</span>