XML的DOM解析(Java实现)

目录

一、DOM定义

二、DOM代码实现

1、注意:我们应当认识到,DOM一切皆节点。

2、XML文件代码 

3、DOM解析XML的过程

 三、通用方法用于把所有的xml文件进行解析

四、实现 XML增加、修改和删除操作

        1、增加功能代码

​         2、修改功能代码

​        3、删除功能代码 


一、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版权协议,转载请附上原文出处链接和本声明。