- DOM
- Document Object Model 文档对象模型, 擅长读(小规模)/写, 直观易用
- 其处理方式是将XML整个作为类似树结构的方式读入内存中以便操作及解析, 方便修改.
所以当解析大数据量的XML文件时, 有内存泄漏及程序崩溃的风险.
- DOM类
- DocumentBuilder解析类, parse方法
- Node节点主接口, getChildNodes返回一个NodeList
- NodeList节点列表, 每一个元素是一个Node
- Document文档根节点
- Element标签节点元素(每一个标签都是标签节点)
- Text节点(包含在XML元素内的, 都算Text节点)
- Attr节点(每一个属性节点)
// XML_DOMReadWrite.java
package hello;
import org.w3c.dom.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
public class XML_DOMReadWrite {
public static void main(String[] args) {
// recursiveTraverse();
// traverseBySearch();
writeXml();
}
/**
* 从上到下访问xml
*/
public static void recursiveTraverse() {
try {
// 采用Dom解析xml文件
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse("users.xml");
// 获取所有的一级子菜单
NodeList usersList = doc.getChildNodes();
for (int i = 0; i < usersList.getLength(); i++) {
Node users = usersList.item(i);
NodeList userList = users.getChildNodes(); // 获取二级子节点user的列表
for (int j = 0; j < userList.getLength(); j++) {
Node user = userList.item(j);
if (user.getNodeType() == Node.ELEMENT_NODE) {
NodeList metaList = user.getChildNodes();
for (int k = 0; k < metaList.getLength(); k++) { // 7
// 到最后一级菜单
Node meta = metaList.item(k);
if (meta.getNodeType() == Node.ELEMENT_NODE) {
System.out.println(metaList.item(k).getNodeName() + ":" + metaList.item(k).getTextContent());
}
}
System.out.println("-------");
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 根据名称进行搜索
*/
public static void traverseBySearch() {
try {
// 采用 Dom 解析xml文件
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse("users.xml");
Element rootEle = doc.getDocumentElement();
NodeList nodeList = rootEle.getElementsByTagName("name");
if (nodeList != null) {
for (int i = 0; i < nodeList.getLength(); i++) {
Element ele = (Element) nodeList.item(i);
System.out.println(ele.getNodeName() + " = " + ele.getTextContent());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 写xml文件
*/
public static void writeXml() {
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.newDocument(); // 新创建一个Document节点
if (doc != null) {
Element docx = doc.createElement("document"); // 都采用Document创建元素
Element ele1 = doc.createElement("ele1");
ele1.setAttribute("type", "pragraph");
ele1.setAttribute("alignment", "left"); // element增加两个属性
Element ele2 = doc.createElement("ele2");
ele2.setAttribute("type", "text");
ele2.setAttribute("alignment", "right");
Element ele3 = doc.createElement("ele3");
ele3.appendChild(doc.createTextNode("aaa")); // 给节点赋值
ele1.appendChild(ele3);
docx.appendChild(ele1);
docx.appendChild(ele2);
doc.appendChild(docx);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
DOMSource source = new DOMSource(doc);
// 定义目标文件
File file = new File("dom_write_test.xml");
StreamResult result = new StreamResult(file);
// 将xml内容写入到文件中
transformer.transform(source, result);
System.out.println("write xml file successfully");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
<!-- users.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="001">
<name>Mary</name>
<age>3</age>
<sex>Female</sex>
</user>
<user id="002">
<name>Mike</name>
<age>18</age>
<sex>Male</sex>
</user>
<user id="003">
<name>ZhaZhaHui</name>
<age>38</age>
<sex>Male</sex>
</user>
</users>
<!-- dom_write_test.xml -->
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document>
<ele1 alignment="left" type="pragraph">
<ele3>aaa</ele3>
</ele1>
<ele2 alignment="right" type="text"/>
</document>