部分代码参考了其他博客文章,将之列出来便于以后参考:
1.http://www.cnblogs.com/xiaopeipei/p/3857750.html
2.http://blog.csdn.net/gavin_john/article/details/51694615
DOM(DocumentObject Model)w3c提供的接口,是将整个XML文档读入内存,构建一个DOM树来对各个节点(Node)进行操作
优点:1.整棵树都在内存中,可以进行随机访问
2.可以对XML文档进行修改操作
3.和sax,dom相比使用较为简单
缺点:
1.整个文档必须一次性解析完
2.整个文档都需要载入内存,对于较大的文档资源消耗较高
测试XML文件:
test.xml:
<?xml version="1.0" encoding="UTF-8"?>
<university name="pku">
<college name="c1">
<class name="class1">
<student name="stu1" sex='male' age="21" />
<student name="stu2" sex='female' age="20" />
<student name="stu3" sex='female' age="20" />
</class>
<class name="class2">
<student name="stu4" sex='male' age="19" />
<student name="stu5" sex='female' age="20" />
<student name="stu6" sex='female' age="21" />
</class>
</college>
<college name="c2">
<class name="class3">
<student name="stu7" sex='male' age="20" />
</class>
</college>
<college name="c3">
</college>
</university>
Dom.java
package xml.dom;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
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.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;
/**
* 使用Dom读写XML
*
* 步骤:(读)
* 1.新建 DocumentBuilderFactory
* 2.新建 DocumentBuilder
* 3.新建 InputStream:读入XML文件
* 4.Document doc = builder.parse(in); 将XML文件解析为Document
* 5.Dom会将文件加载到内存中,因此可以进行随机访问,详情看代码
*
* (写,这里是修改test.xml文件并保存到另外一个文件中)
* 1.新建DocumentBuilderFactory
* DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
* 2.新建DocumentBuilder
* DocumentBuilder builder = dbf.newDocumentBuilder();
* 3.输入流 InputStream读取test.xml
* InputStream in = TestDom.class.getClassLoader().getResourceAsStream("test.xml");
* 4.解析为Document
* Document doc = builder.parse(in);
* 5.获取根节点(这步开始可以根据自己的需要来修改相应的数据,具体看write()方法)
* Element root = doc.getDocumentElement();
*
* @author echo
* @date 2017.3.15
*/
public class Dom {
public static void main(String[] args) throws ParserConfigurationException {
// read();
// readE();
write();
}
/**
* 一层一层判断读取
*/
public static void read() {
// 新建DocumentBuilderFactory
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = dbf.newDocumentBuilder();
// 获取目标XML文件,输入流
InputStream in = Dom.class.getClassLoader().getResourceAsStream(
"test.xml");
// 解析为Document
Document doc = builder.parse(in);
// 得到根节点
Element root = doc.getDocumentElement();
// 根节点为空,返回
if (root == null) {
return;
}
// 显示根节点
System.out.println("root:" + root.getAttribute("name"));
// 所有节点
NodeList collegeNodes = root.getChildNodes();
if (collegeNodes == null) {
return;
}
for (int i = 0; i < collegeNodes.getLength(); i++) {
Node college = collegeNodes.item(i);
if (college != null
&& college.getNodeType() == Node.ELEMENT_NODE) {
System.err.println("\t"
+ college.getAttributes().getNamedItem("name")
.getNodeValue());
}
NodeList classNodes = college.getChildNodes();
if (classNodes == null) {
return;
}
for (int j = 0; j < classNodes.getLength(); j++) {
Node clazz = classNodes.item(j);
if (clazz != null
&& clazz.getNodeType() == Node.ELEMENT_NODE) {
System.err.println("\t\t"
+ clazz.getAttributes().getNamedItem("name")
.getNodeValue());
// 所有学生节点
NodeList studentNodes = clazz.getChildNodes();
if (studentNodes == null) {
continue;
}
for (int k = 0; k < studentNodes.getLength(); k++) {
Node student = studentNodes.item(k);
if (student != null
&& student.getNodeType() == Node.ELEMENT_NODE) {
System.err.print("\t\t\t"
+ student.getAttributes()
.getNamedItem("name")
.getNodeValue());
System.err.print(" "
+ student.getAttributes()
.getNamedItem("sex")
.getNodeValue());
System.err.println(" "
+ student.getAttributes()
.getNamedItem("age")
.getNodeValue()
+ student.getNodeName());
}
}
}
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 调用readNode()方法来获取并显示XML节点
* @throws ParserConfigurationException
*/
public static void readE() throws ParserConfigurationException {
// 新建DocumentBuilderFactory
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbf.newDocumentBuilder();
InputStream in = Dom.class.getClassLoader().getResourceAsStream("test.xml");
Document doc;
try {
// 解析为Document
doc = builder.parse(in);
// 得到根节点
Element root = doc.getDocumentElement();
// NodeList nodelist = doc.getElementsByTagName("class");
// 获取子节点
NodeList nodelist = root.getChildNodes();
// 调用readNode()方法读取并显示出子节点
readNode(nodelist, "");
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 采用递归方式进行XML的读取
* 是为了简化read()方法中一直用if来判断,如果XML有很多层,不可能全部像read()中的方法进行判断
* @param nodelist NodeList
* @param prefix
*/
public static void readNode(NodeList nodelist, String prefix) {
// 判断nodelist是否为空
if(nodelist == null) {
return;
}
// 循环遍历
for(int i = 0; i < nodelist.getLength(); i++) {
// 获得第i个节点
Node node = nodelist.item(i);
// 判断是否是Element
if(node != null && node.getNodeType() == Node.ELEMENT_NODE) {
System.out.print(prefix);
// 打印出name
System.err.print(node.getAttributes().getNamedItem("name").getNodeValue());
// 获取node的子节点
NodeList list = node.getChildNodes();
prefix += "\t";
// 递归调用
System.out.println();
readNode(list, prefix);
}
}
}
/**
* dom进行XML的写操作
*/
public static void write() {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = dbf.newDocumentBuilder();
InputStream in = Dom.class.getClassLoader().getResourceAsStream("test.xml");
Document doc = builder.parse(in);
Element root = doc.getDocumentElement();
if(root == null) {
return;
}
// 修改属性
root.setAttribute("name", "dom_change");
NodeList collegeNodes = root.getChildNodes();
if(collegeNodes != null) {
for(int i = 0; i < collegeNodes.getLength() - 1; i++) {
// 删除节点
Node college = collegeNodes.item(i);
if(college.getNodeType() == Node.ELEMENT_NODE) {
String collegeName = college.getAttributes().getNamedItem("name").getNodeValue();
if("c1".equals(collegeName) || "c2".equals(collegeName)) {
root.removeChild(college);
} else if("c3".equals(collegeName)) {
Element newchild = doc.createElement("class");
newchild.setAttribute("name", "c4");
college.appendChild(newchild);
}
}
}
}
// 新增节点
Element addCollege = doc.createElement("college");
addCollege.setAttribute("name", "c5");
root.appendChild(addCollege);
Text text = doc.createTextNode("text");
addCollege.appendChild(text);
// 将修改后的文档保存到文件
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer();
DOMSource domSource = new DOMSource(doc);
File file = new File("src/dom_modify.xml");
if(file.exists()) {
file.delete();
}
file.createNewFile();
FileOutputStream out = new FileOutputStream(file);
StreamResult xmlResult = new StreamResult(out);
transformer.transform(domSource, xmlResult);
System.out.println(file.getAbsolutePath());
} catch (Exception e) {
e.printStackTrace();
}
}
}
本人水平有限,如有错误,敬请告知!!谢谢啦~~~