JAVA项目文件
package dom_jiexi;
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.Attr;
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 XmlCrudDemo {
@Test
public void test() throws ParserConfigurationException, SAXException,
IOException, TransformerException {
// 调用DocumentBuilderFactory中的newInstance(),创建新的DocumentBuilderFactory实例对象
DocumentBuilderFactory builderFactory = DocumentBuilderFactory
.newInstance();
// 调用DocumentBuilderFactory中的newDocumentBuilder();创建一个新的Documentbuilder实例对象
DocumentBuilder builder = builderFactory.newDocumentBuilder();
// 调用DocumentBuilder中的parse(File f);方法创建指定文件的Document对象
Document document = builder.parse(this.getClass().getClassLoader()
.getResourceAsStream("dom_jiexi//java.xml"));
String tagname = "王亮";
// insert(document);
// findByElementName(document);
// findByName(document, "Boss姚");
// findById(document, "x121");
// deleteNodeById(document, "x121");
// updateNodeById(document, "x121");
insert(document, "x121");
}
// 向xml文件中指定的节点后添加节点
public void insert(Document document, String id)
throws TransformerException {
// 获取要操作的元素节点对象
Element elm = document.getElementById(id);
// 获取该节点的父节点
Node nodeparent = elm.getParentNode();
// 通过传入的document对象创建一个指定的元素节点对象
Element nd = document.createElement("student");
// 设置属性并赋值
nd.setAttribute("id", "x13333");
// 创建元素节点对象
Node name = document.createElement("name");
Node age = document.createElement("age");
Node sex = document.createElement("sex");
// 为创建的元素节点对象的文本节点赋值
name.setTextContent("donghongyujava");
age.setTextContent("20");
sex.setTextContent("男");
// 将创建的子节点子节点的对象添加到子节点下
nd.appendChild(name);
nd.appendChild(age);
nd.appendChild(sex);
// 将子节点添加到父节点
nodeparent.appendChild(nd);
// 创建TransformerFactory对象
TransformerFactory transformerFactory = TransformerFactory
.newInstance();
// Transformer类用来将代表xml文件的Document对象装换位某种格式后进行输出
// Transformer对象通过TransformerFactory获得
Transformer transformer = transformerFactory.newTransformer();
// 将处理后的Document对象重新写入 到另一个xml文件
transformer.transform(new DOMSource(document), new StreamResult(
new File("src//c.xml")));
}
// 根据标签名称来查找所有改名称的节点对象
public void findByElementName(Document document) {
// 获取指定的标记名称的所有元素的节点集合
NodeList nodelist = document.getElementsByTagName("teacher");
System.out.println(nodelist.getLength());
for (int i = 0; i < nodelist.getLength(); i++) {
// 遍历得到集合中的每一个元素
Node node = nodelist.item(i);
System.out.println(node.getNodeName());
}
}
// 根据属性的值查找节点对象
public Node findByName(Document document, String tagname) {
// 获取指定的标记名称的所有元素的节点集合
NodeList nodelist = document.getElementsByTagName("teacher");
for (int i = 0; i < nodelist.getLength(); i++) {
// 遍历得到集合中的每一个元素
Element node = (Element) nodelist.item(i);
// 获取指定的元素中的指定的属性
Attr attr = node.getAttributeNode("name");
// 判断属性的值
if (attr.getValue().equals(tagname)) {
System.out.println(attr);
// 返回符合条件的元素
return node;
}
}
return null;
}
// 根据ID产找节点对象
public Node findById(Document document, String id) {
Node node = document.getElementById(id);
System.out.println(node);
return node;
}
// 删除获取到的节点
public void deleteNodeById(Document document, String id)
throws TransformerException {
// 获取要删除的节点对象
Node node = document.getElementById(id);
// 得到父节点后在删除子节点
Node nod = node.getParentNode().removeChild(node);
// 创建TransformerFactory对象
TransformerFactory transformerFector = TransformerFactory.newInstance();
// Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出
// Transformer对象通过TransformerFactory获得
Transformer transformer = transformerFector.newTransformer();
// 调用transform();将Document对象重新写入一个XML文件中
transformer.transform(new DOMSource(document), new StreamResult(
new File("src//a.xml")));
}
// 更新指定数据
public void updateNodeById(Document document, String id)
throws TransformerException {
// 根据id获取指定元素的节点对象
Element node = document.getElementById(id);
// 获取元素节点的id属性节点对象
Attr attr = node.getAttributeNode("id");
// 修改元素节点的属性值
attr.setValue("x122");
// 获取该节点的对象的所有孩子节点对象name,age,sex节点
NodeList nodelist = node.getChildNodes();
// 遍历集合
for (int i = 0; i < nodelist.getLength(); i++) {
// 得到每一个子节点的实体
Node no = nodelist.item(i);
// 判断是否是元素节点对象
if (no.getNodeType() == Node.ELEMENT_NODE) {
// 判断是否是name节点
if (no.getNodeName().equals("name")) {
// 设置name元素节点下的文本节点内容
no.setTextContent("董宏宇");
} else if (no.getNodeName().equals("age")) {
no.setTextContent("20");
} else if (no.getNodeName().equals("sex")) {
no.setTextContent("男");
} else {
System.out.println("没有可修改元素节点对象");
}
}
}
// 创建TransformerFactory对象
TransformerFactory transformerFactory = TransformerFactory
.newInstance();
// Transformer类用于把代表xml文件的Document对象转换为某种格式后进行输出
// transformer对象通过transformerFactory获得
Transformer transformer = transformerFactory.newTransformer();
// 把更改后的document对象重新写入到一个xml文件中
transformer.transform(new DOMSource(document), new StreamResult(
new File("src//b.xml")));
}
}
XML文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE classes SYSTEM "bin//dom_jiexi//java.dtd">
<classes>
<java班 name="CSDNJava01班">
<teachers>
<teacher name="军哥" sex="男" age="28" />
<teacher name="丽华" sex="女" age="28" />
</teachers>
<students>
<student id="x121">
<name>Martin</name>
<sex>女</sex>
<age>28</age>
</student>
</students>
</java班>
<!-- 注释0 -->
<net班 name="CSDNNet01班">
<teachers>
<teacher name="Boss姚" sex="男" age="28" />
<teacher name="石老师" sex="女" age="28" />
</teachers>
</net班>
<php班 name="CSDNPhp01班"></php班>
<ios班 name="CSDNIos01班"></ios班>
</classes>
<!-- 对java.xml文件进行CRUD的操作 -->
<!-- 节点
nodeName nodeValue nodeType
element 标签名 null 1
Attr 属性名 属性值 2
text #text 文本的值 3
-->
DTD约束文件
<!ELEMENT classes (java班,net班,php班,ios班)>
<!ELEMENT java班 (teachers?,students?)>
<!ELEMENT net班 (teachers?,students?)>
<!ELEMENT php班 (teachers?,students?)>
<!ELEMENT ios班 (teachers?,students?)>
<!ELEMENT teachers (teacher*)>
<!ELEMENT teacher EMPTY>
<!ELEMENT students (student*)>
<!ELEMENT student (name,sex,age)>
<!ATTLIST java班 name CDATA #IMPLIED>
<!ATTLIST net班 name CDATA #IMPLIED>
<!ATTLIST php班 name CDATA #IMPLIED>
<!ATTLIST ios班 name CDATA #IMPLIED>
<!ATTLIST teacher name CDATA #IMPLIED>
<!ATTLIST teacher sex CDATA #IMPLIED>
<!ATTLIST teacher age CDATA #IMPLIED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ATTLIST student id ID #IMPLIED>