XML--(3)解析、DOM解析、dom4j解析

XML 文档结构

XML树结构
在这里插入图片描述
在这里插入图片描述

结点

文档结点

在这里插入图片描述

元素结点

在这里插入图片描述

属性结点

在这里插入图片描述

文本结点

在这里插入图片描述

DOM

什么是DOM

DOM:Document Object Model:文档对象模型,把文档中的成员描述成一个个对象.
使用Java代码操作XML 或者 js代码操作HTML

DOM解析特点

  1. 在加载的时候,一次性的把整个XML文档加载进内存,在内存中形成一颗树(Document对象).
  2. 以后使用代码操作Document,其实操作的是内存中的DOM树,和本地磁盘中的XML文件没有直接关系.
  3. 由于操作的是内存当中的dom,磁盘中xml当中的内容并没有变,要进行同步,让两边保持一致
    查询不需要同步,只有数据变化的时候,才需要同步
  4. 缺点:若XML文件过大,可能造成内存溢出.

DOM 解析步骤

创建解析器工厂
通过解析器工厂得到解析器
通过解析器得到document对象
获取具体的节点内容
ParseClass.java

package com_xml_01.parse;

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.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;



public class ParseClass {
	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
		/* *
		1.创建解析器工厂
		2.通过解析器工厂得到解析器
		3.通过解析器得到document对象
		4.获取具体的节点内容
		 * */
		//创建解析器工厂
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();    // Ctrl+1 快捷键
		//2.通过解析器工厂得到解析器
		DocumentBuilder db = dbf.newDocumentBuilder();
		//3.通过解析器得到document对象
		Document doc = db.parse("src/com_xml_01/parse/student.xml");
		//4.获取具体的节点内容
		NodeList list = doc.getElementsByTagName("name");
		Node name = list.item(0);									//	返回的是结点
		System.out.println(name.getTextContent());
	}
}

在这里插入图片描述
自动生成
在这里插入图片描述
改一下变量名
在这里插入图片描述
在这里插入图片描述
自动生成
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
打印看一下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
chrl+1
在这里插入图片描述

DOM修改元素内容

  1. 获取所有指定节点
  2. 获取要修改的节点
  3. 修改元素内容
  4. 从内存写到文档做同步操作

DOM添加元素

  1. 创建一个节点
  2. 设置元素内容
  3. 获取要添加元素的父结点
  4. 添加结点
  5. 从内存写到文档做同步操作

DOM删除元素

  1. 获取一个节点
  2. 获取该节点的父节点,从父节点当中移除
  3. 从内存写到文档做同步操作

DOM添加元素属性

  1. 获取要添加属性的节点
  2. 把获取的节点强制转换成element
  3. 设置属性
  4. 从内存写到文档做同步操作
package com_xml_01.parse;

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.TransformerFactoryConfigurationError;
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 ParseClass {
	public static void main(String[] args) throws TransformerFactoryConfigurationError, Exception {
		/* *
		1.创建解析器工厂
		2.通过解析器工厂得到解析器
		3.通过解析器得到document对象
		4.获取具体的节点内容
		 * */
		//创建解析器工厂
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();    // Ctrl+1 快捷键
		//2.通过解析器工厂得到解析器
		DocumentBuilder db = dbf.newDocumentBuilder();
		//3.通过解析器得到document对象
		Document doc = db.parse("src/com_xml_01/parse/student.xml");
		//4.获取具体的节点内容
		test1(doc);
		test2(doc);
		test3(doc);
		//test4(doc);
		test5(doc);
	}
	// 获取具体的结点内容
	static void test1(Document doc) {		//4.获取具体的节点内容
		NodeList list = doc.getElementsByTagName("name");
		Node name = list.item(0);									//	返回的是结点
		System.out.println(name.getTextContent());
	}
	// 修改元素内容
	static void test2(Document doc) throws TransformerFactoryConfigurationError, Exception {
		//1. 获取所有指定节点
		//2.获取要修改的节点
		//3.修改元素内容
		//4.从内存写到文档做同步操作
		NodeList agelist = doc.getElementsByTagName("age");			//1. 获取所有指定节点
		Node ageNode = agelist.item(1);				//2.获取要修改的节点
		ageNode.setTextContent("400");					//3.修改元素内容
		Transformer tf = TransformerFactory.newInstance().newTransformer();
		tf.transform(new DOMSource(doc), new StreamResult("src/com_xml_01/parse/student.xml"));								//第一个输入的,第二个是输出
	}
		//添加元素
	static void test3(Document doc) throws TransformerFactoryConfigurationError, TransformerException {
		//1.创建一个节点
		//2.设置元素内容
		//3.获取要添加元素的父结点
		//4.添加结点
		//5.从内存写到文档做同步操作
		Element addressEle = doc.createElement("address");  			//1.创建一个节点
		addressEle.setTextContent("地址");										//2.设置元素内容
		Node stuNode = doc.getElementsByTagName("student").item(0);  			//3.获取要添加元素的父结点
		stuNode.appendChild(addressEle);  //4.添加结点
		Transformer tf = TransformerFactory.newInstance().newTransformer();
		tf.transform(new DOMSource(doc), new StreamResult("src/com_xml_01/parse/student.xml"));	
	}
	//删除元素
	static void test4(Document doc) throws TransformerFactoryConfigurationError, TransformerException {
			//1.获取一个节点
			//2.获取该节点的父节点,从父节点当中移除
			//3.从内存写到文档做同步操作
		Node addressNode = doc.getElementsByTagName("address").item(0); 	//1.获取一个节点
		addressNode.getParentNode().removeChild(addressNode);	 					//2.获取该节点的父节点,从父节点当中移除
		Transformer tf = TransformerFactory.newInstance().newTransformer();
		tf.transform(new DOMSource(doc), new StreamResult("src/com_xml_01/parse/student.xml"));		
	}
	//添加元素属性
	static void test5(Document doc) throws TransformerFactoryConfigurationError, TransformerException {
		//1. 获取要添加属性的节点
		//2. 把获取的节点强制转换成element
		//3. 设置属性
		//4. 从内存写到文档做同步操作
		Node stu = doc.getElementsByTagName("student").item(1);  //1. 获取要添加属性的节点
		Element ele = (Element)stu;
		ele.setAttribute("ID", "00001");
		Transformer tf = TransformerFactory.newInstance().newTransformer();
		tf.transform(new DOMSource(doc), new StreamResult("src/com_xml_01/parse/student.xml"));			
	}
}

dom4j 解析

Sax解析

逐行读取,基于事件驱动
优点:不占内存,速度快
缺点:只能读取,不能回写
在这里插入图片描述

DOM4J介绍

  1. DOM4J是dom4j.org出品的一个开源XML解析包
  2. dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的软件
  3. 越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这已经是必须使用的jar包, Hibernate也用它来读写配置文件。

官网链接

安装与配置

在这里插入图片描述
1.在工程文件夹下新建文件夹 lib
在这里插入图片描述
2.将第三方包放到lib问价夹下
在这里插入图片描述
3.build-path
在这里插入图片描述
4.成功
在这里插入图片描述

不用第三方包时,彻底删除

在工程文件夹上右键
在这里插入图片描述
在这里插入图片描述


DOM4J 获取标签内容

package com_xml_01.dom4j;

import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Dom4jTest {
	public static void main(String[] args) throws Exception  {
		        //获取所有标签的内容
        /* *
         1. 创建SAXReader
         2. 获取根元素
         3. 获取根元素下的所有元素
         4. 遍历每一个元素
         5. 获取指定名称的元素
         6. 获取标签当中的文本
         */
		SAXReader reader = new SAXReader();																	 //1. 创建SAXReader
        Document doc = reader.read("src/com_xml_01/dom4j/student.xml");
        Element rootElement = doc.getRootElement(); 							//获取根元素
        List<Element> stuList = rootElement.elements("student");				//根据名称获取根元素下的所有子标签
        for (Element stuEle : stuList) {								//遍历每一个元素
			//法一:
        	//Element nameEle = stuEle.element("name");   //获取指定名称的元素
			//System.out.println(nameEle.getText()); 	 			//获取标签当中的文本
        	
        	//法二:
        	String name = stuEle.elementText("name");
        	String age = stuEle.elementText("age");
        	String sex = stuEle.elementText("sex");
        	String num = stuEle.attributeValue("number");					//获取属性值
        	System.out.println(name);
        	System.out.println(age);
        	System.out.println(sex);
        	System.out.println(num);
        	System.out.println("-------");
		}
	}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

DOM4J 添加元素

  1. 创建SAXReader
  2. 获取根元素
  3. 给元素添加属性,并返回添加的元素
package com_xml_01.dom4j;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class Dom4jTest {
	public static void main(String[] args) throws Exception  {
		        //获取所有标签的内容
        /* *
         1. 创建SAXReader
         2. 获取根元素
         3. 获取根元素下的所有元素
         4. 遍历每一个元素
         5. 获取指定名称的元素
         6. 获取标签当中的文本
         */
		SAXReader reader = new SAXReader();																	 //1. 创建SAXReader
        Document doc = reader.read("src/com_xml_01/dom4j/student.xml");
        test1(doc);
        test2(doc);
	}
        
        static void test1(Document doc) {
        	Element rootElement = doc.getRootElement(); 							//获取根元素
            List<Element> stuList = rootElement.elements("student");				//根据名称获取根元素下的所有子标签
            for (Element stuEle : stuList) {								//遍历每一个元素
    			//法一:
            	//Element nameEle = stuEle.element("name");   //获取指定名称的元素
    			//System.out.println(nameEle.getText()); 	 			//获取标签当中的文本
            	
            	//法二:
            	String name = stuEle.elementText("name");
            	String age = stuEle.elementText("age");
            	String sex = stuEle.elementText("sex");
            	String num = stuEle.attributeValue("number");					//获取属性值
            	System.out.println(name);
            	System.out.println(age);
            	System.out.println(sex);
            	System.out.println(num);
            	System.out.println("-------");
            }
        }
        static void test2(Document doc) throws IOException {
        	//1.创建SAXReader
        	//2. 获取根元素
        	//3.给元素添加属性,并返回添加的元素
        	Element rootElement = doc.getRootElement(); 							//获取根元素
        	Element stuEle = rootElement.addElement("student").addAttribute("number", "a003");
        	stuEle.addElement("name").setText("王五");
        	stuEle.addElement("age").setText("1000");
        	stuEle.addElement("sex").setText("男");
        	 //写入 文本直接追加
        	//Writer wr = new OutputStreamWriter(new FileOutputStream("src/com_xml_01/dom4j/student.xml"),"UTF-8");
        	//doc.write(wr);
        	//wr.close();
        	
        	// Pretty print the document to System.out   美化写入
            OutputFormat format = OutputFormat.createPrettyPrint();
            Writer wr = new OutputStreamWriter(new FileOutputStream("src/com_xml_01/dom4j/student.xml"),"UTF-8");
            XMLWriter writer = new XMLWriter(wr, format);
            writer.write( doc );
            wr.close();
        }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值