目录
一、DOM定义
DOM:Document Object Model,文档对象模型,DOM解析方式把整个文档看成是一个倒挂的树形结构来进行解析。有助于更好的理解、且代码容易编写。解析过程中,树结构保存在内存中,方便修改。主要使用的包是java的org.w3c.dom包。
二、DOM代码实现
1、注意:我们应当认识到,DOM一切皆节点。
2、XML文件代码
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- 全部是节点,而非键值对k-v -->
<department>
<student id="110">
<name>小丑</name>
<age>100</age>
</student>
<student id="220">
<name>卡牌</name>
<age>15</age>
</student>
<student id="110">
<name>德玛西亚</name>
<age>60</age>
</student>
<student id="220">
<name>卡特</name>
<age>20</age>
</student>
</department>
3、DOM解析XML的过程
1.通过单例模式获取document解析工厂对象
2.通过文档解析工厂对象 去获取解析对象
3.通过文档解析器获取文档对象
代码实现:
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;//导包要注意一定要导org.w3c.dom相关的
import org.xml.sax.SAXException;
public class XMLTests {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//创建一个DocumentBuilderFactory的对象
DocumentBuilder builder = factory.newDocumentBuilder();//创建一个DocumentBuilder对象
Document doc = builder.parse("D:\\Program Files\\Java\\JavaStudent\\Xmls\\src\\com\\DJX\\xmlparse\\department.xml");
//需要解析XML文件的地址(注意文件名称中不能存在中文否则会报错)
}
}
4.获取根节点、student节点、name节点
代码实现:
Element root = doc.getDocumentElement();//获取根节点
Node student = root.getFirstChild().getNextSibling();// 获取student节点
Node name = student.getFirstChild().getNextSibling();// 获取name的节点
Node age = name.getNextSibling().getNextSibling();//获取age的节点
System.out.println("节点的名称:"+name.getNodeName()+"节点的文本:"+name.getTextContent());
//getFirstChild()是获取第一个子节点
//getNextSibling()是获取兄弟节点
注意:root节点与student节点之间的空格也是一个节点,所以根节点的第一个子节点应该是空格,空格的兄弟节点才是student。
5. 效果展示
三、通用方法用于把所有的xml文件进行解析
代码展现:
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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;
public class XMLUtils {
/*
* 构造方法私有化
*/
private XMLUtils() {
}
//对获取document对象进行封装
public static Document getDocumentInstance(String xmlfile) throws SAXException, IOException, ParserConfigurationException {
DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc =builder.parse(xmlfile);
return doc;
}
//对文档进行遍历的通用方法
public static void visit(Node start) {
if(start.getNodeName()!="#text")
System.out.println(start.getNodeName()+"……"+start.getNodeValue());
// 确保传递的节点对象是Element
// 因为Attribute 一定在Element中
if(start.getNodeType()==Node.ELEMENT_NODE) {
NamedNodeMap nnm=start.getAttributes();
// 处理属性节点对象
for(int i=0;i<nnm.getLength();i++) {
Node arr = nnm.item(i);
if(start.getNodeName()!="#text")
System.out.println(arr.getNodeName()+"……"+arr.getNodeValue());
}
for(Node sub=start.getFirstChild();sub!=null;sub=sub.getNextSibling()) {
visit(sub);//采用递归的方式实现
}
}
}
//对输出功能的封装
public static void print(Document dc,String name) {
NodeList list = dc.getElementsByTagName(name);
for(int i=0;i<list.getLength();i++) {
Element e = (Element) list.item(i);
System.out.print("id:"+e.getAttribute("id"));
System.out.print(list.item(i).getTextContent());
}
}
}
四、实现 XML增加、修改和删除操作
1、增加功能代码
import java.io.IOException;
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.Text;
import org.xml.sax.SAXException;
public class XMLAddTest {
public static void main(String[] args) throws TransformerConfigurationException {
try {
// 获取document对象
Document doc = XMLUtils.getDocumentInstance("D:\\Program Files\\Java\\JavaStudent\\Xmls\\src\\com\\DJX\\xmlparse\\department.xml");
Element sex =doc.createElement("sex");//创建element
Text setText = doc.createTextNode("男");//设置sex节点的文本信息
Node sexNode=sex.appendChild(setText);//把text添加为 element的节点
Element root = doc.getDocumentElement();
Node stu = root.getFirstChild().getNextSibling();
stu.insertBefore(sex, stu.getFirstChild());// 插入到文档中去 insert
XMLUtils.visit(root);
//把内存中的添加的内容最终输出到持久化的文档中
TransformerFactory factor =TransformerFactory.newInstance();
Transformer former = factor.newTransformer();
DOMSource ds = new DOMSource(doc);
StreamResult stream = new StreamResult("D:\\Program Files\\Java\\JavaStudent\\Xmls\\src\\com\\DJX\\xmlparse\\department.xml");
try {
former.transform(ds, stream);//第一个参数是输入源 第二个参数是目的地址
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
效果展示:添加sex节点,文本信息为男
2、修改功能代码
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
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.NodeList;
import org.xml.sax.SAXException;
public class XMLUpdate {
public static void main(String[] args) throws TransformerException {
try {
// 获取document对象
Document doc = XMLUtils.getDocumentInstance("D:\\Program Files\\Java\\JavaStudent\\Xmls\\src\\com\\DJX\\xmlparse\\department.xml");
Element root = doc.getDocumentElement();
NodeList list = doc.getElementsByTagName("name");//通过getElementsByTagName()方法获取到节点的列表
list.item(0).setTextContent("测试1");//修改查找的节点的文本信息
//把内存中的添加的内容最终输出到持久化的文档中
TransformerFactory factor =TransformerFactory.newInstance();
Transformer former = factor.newTransformer();
DOMSource ds = new DOMSource(doc);
StreamResult stream = new StreamResult("D:\\Program Files\\Java\\JavaStudent\\Xmls\\src\\com\\DJX\\xmlparse\\department.xml");
former.transform(ds, stream);
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
效果展示:将name文本的小丑修改为测试1
3、删除功能代码
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
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.xml.sax.SAXException;
public class XMLDelete {
public static void main(String[] args) throws TransformerException {
Document doc;
try {
doc = XMLUtils.getDocumentInstance("D:\\Program Files\\Java\\JavaStudent\\Xml\\src\\com\\DJX\\xmlparse\\department.xml");
Element root = doc.getDocumentElement();
NodeList list = doc.getElementsByTagName("student");
Node delete = list.item(0).getFirstChild();
while(delete.getNodeName()!="age") {
delete=delete.getNextSibling();
}
if(delete.getNodeName() == "age")
list.item(0).removeChild(delete);
else System.err.print("不存在该数据");
if(list.item(0).getLastChild().getNodeName() == "#text")list.item(0).removeChild(list.item(0).getLastChild());
// System.out.print(list.item(0).getFirstChild().getNextSibling().getNodeName());
// list.item(0).removeChild(list.item(0).getFirstChild().getNextSibling().getNextSibling());
XMLUtils.visit(root);
TransformerFactory factor =TransformerFactory.newInstance();
Transformer former = factor.newTransformer();
DOMSource ds = new DOMSource(doc);
StreamResult stream = new StreamResult("D:\\Program Files\\Java\\JavaStudent\\Xml\\src\\com\\DJX\\xmlparse\\department.xml");
former.transform(ds, stream);
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch(NullPointerException e) {
System.out.print("找不到该数据");
}
}
}
注意:可能想删除的数据不存在,就会抛出一个空指针异常我们需要捕获异常并输出找不到数据。
效果展示:删除age节点
版权声明:本文为qq_48241564原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。