DOM树基础

DOM

基本概念

W3school在线教程

DOM 全称是 Document Object Model 文档对象模型

image-20220418194422808

当网页被加载时,浏览器会创建页面的文档对象模型

image-20220418194536452

document 对象

document 它是一种树结构的文档,有层级关系 在 dom 中把所有的标签都对象化

document 常用方法

image-20220418194949220

getElementById

image-20220418195947100

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript">
		window.onload = function(){
			var name = document.getElementById("name");
			name.onclick = function(){
				console.log(name.innerText); // 罗念笙
				console.log(name.innerHTML); // <i>罗念笙</i>
			}
		}
		</script>
	</head>
	<body>
		<h1 id="name"><i>罗念笙</i></h1>
	</body>
</html>

getElementsByName

image-20220418201901564

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript">
			window.onload = function(){
                 // 注意:getElementsByName中传入的值需要带引号
				var btn1 = document.getElementById("btn1");
				var btn2 = document.getElementById("btn2");
				var btn3 = document.getElementById("btn3");
				var sports = document.getElementsByName("sport");
				btn1.onclick = function(){
					for(i = 0;i < sports.length;i++){
						sports[i].checked = !sports[i].checked;
					}
				}
				btn2.onclick = function(){
					for(i = 0;i < sports.length;i++){
						sports[i].checked = true;
					}
				}
				btn3.onclick = function(){
					for(i = 0;i < sports.length;i++){
						sports[i].checked = false;
					}
				}
			}
		</script>
	</head>
	<body>
		<input type="checkbox" name="sport" id="" value="soccer" />足球
		<input type="checkbox" name="sport" id="" value="basketball" />篮球
		<input type="checkbox" name="sport" id="" value="volleyball" />排球
		<br/>
		<button type="button" id="btn1">反选</button>
		<button type="button" id="btn2">全选</button>
		<button type="button" id="btn3">全不选</button>
	</body>
</html>

createElement

image-20220419150907622

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript">
			window.onload = function(){
				var btn = document.getElementById("btn01");
				btn.onclick = function(){
					// 添加图片标签
					var img = document.createElement("img");
					img.src = "./imgs/1.png";
					img.width = 100;
					document.body.appendChild(img);
				}
			}
		</script>
	</head>
	<body>
		<input type="button" id="btn01" value="按钮" />
	</body>
</html>

HTML DOM节点

W3school文档

在 HTML DOM(文档对象模型)中,每个部分都是节点

  • 文档本身是文档节点
  • 所有 HTML 元素是元素节点
  • 所有 HTML 属性是属性节点
  • HTML 元素内的文本是文本节点
  • 注释是注释节点

实战练习

image-20220419161911992

/* .css文件 */
@CHARSET "UTF-8";

body {
	width: 800px;
	margin-left: auto;
	margin-right: auto;
	韩顺平 Java 工程师
}

button {
	width: 200px;
	margin-bottom: 10px;
	text-align: left;
}

#btnList {
	float: left;
}

#total {
	width: 450px;
	float: left;
}

ul {
	list-style-type: none;
	margin: 0px;
	韩顺平 Java 工程师 padding: 0px;
}

.inner li {
	border-style: solid;
	border-width: 1px;
	padding: 5px;
	margin: 5px;
	float: left;
}

.inner {
	width: 400px;
	border-width: 1px;
	margin-bottom: 10px;
	padding: 10px;
	float: left;
}
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>演示 HTML DOM 相关方法</title>
		<link rel="stylesheet" type="text/css" href="./css/test.css" />
		<script type="text/javascript">
			window.onload = function(){
				// 查找 id=java 节点
				var btn1 = document.getElementById("btn01");
				btn1.onclick = function(){
					console.log("查找 id = java的节点");
					var java = document.getElementById("java");
					console.log(java.innerText);
				}
				
				// 查找所有 option 节点
				var btn2 = document.getElementById("btn02");
				btn2.onclick = function(){
					console.log("查找所有 option 节点");
					var optionAll = document.getElementsByTagName("option");
					for(i = 0;i < optionAll.length;i++){
						console.log(optionAll[i].innerText);
					}
				}
				
				// 查找 name=sport 的节点
				var btn3 = document.getElementById("btn03");
				btn3.onclick = function(){
					console.log("查找 name=sport 的节点");
					var sports = document.getElementsByName("sport");
					for(i = 0;i < sports.length;i++){
						console.log(sports[i].value);
					}
				}
				
				// 查找 id=language 下所有li节点
				var btn4 = document.getElementById("btn04");
				btn4.onclick = function(){
					console.log("查找 id=language 下所有li节点");
					var liAll = document.getElementById("language").getElementsByTagName("li");
					for(i = 0;i < liAll.length;i++){
						console.log(liAll[i].innerText);
					}
				}
				
				// 返回 id=sel01 的所有子节点
				var btn5 = document.getElementById("btn05");
				btn5.onclick = function(){
					console.log("返回 id=sel01 的所有子节点");
					var sel01_Child = document.getElementById("sel01").childNodes;
					for(i = 0;i < sel01_Child.length;i++){
						console.log(sel01_Child[i].innerText); // 11 个子节点
					}
				}
				
				// 返回 id=sel01 的第一个子节点
				var btn6 = document.getElementById("btn06");
				btn6.onclick = function(){
					console.log("返回 id=sel01 的第一个子节点");
					var sel01_First_Child = document.getElementById("sel01").childNodes;
					console.log(sel01_First_Child.firstChild); // undefined 
				}
				
				// 返回 id=java 的父节点
				var btn7 = document.getElementById("btn07");
				btn7.onclick = function(){
					console.log("返回 id=java 的父节点");
					var java_Parent = document.getElementById("java").parentElement;
					console.log(java_Parent);
				}
				
				// 返回 id=ct 的前后兄弟节点
				var btn8 = document.getElementById("btn08");
				btn8.onclick = function(){
					console.log("返回 id=ct 的前后兄弟节点");
					// previousSibling属性,获取当前节点的上一个节点(前一个)
					var ct_Brother = document.getElementById("ct").previousSibling;
					console.log(ct_Brother.innerText); // undefined 
					// nextSibling属性,获取当前节点的下一个节点(后一个)
					var ct_Brother = document.getElementById("ct").nextSibling;
					console.log(ct_Brother.innerText); // undefined 
				}
				
				// 读取 id=ct 的 value 属性值
				var btn9 = document.getElementById("btn09");
				btn9.onclick = function(){
					console.log("读取 id=ct 的 value属性值");
					var ct_Value = document.getElementById("ct");
					console.log(ct_Value.value);
				}
				
				// 设置 #person 的文本域
				var btn10 = document.getElementById("btn10");
				btn10.onclick = function(){
					console.log("设置 #person 的文本域");
					var person = document.getElementById("person");
					person.value = "大家好呀,我是小笙";
					console.log(person.value);
				}
				
			}
		</script>
	</head>
	<body>
		<div id="total">
			<div class="inner">
				<P> 你会的运动项目: </P> 
				<input type="checkbox" name="sport" value="zq" checked="checked">足球 
				<input type="checkbox" name="sport" value="tq">台球 
				<input type="checkbox" name="sport" value="ppq">乒乓球
				<br />
				<hr />
				<P> 你当前女友是谁: </P> <select id="sel01">
					<option>---女友---</option>
					<option>艳红</option>
					<option id="ct" value="春桃菇凉">春桃</option>
					<option>春花</option>
					<option>桃红</option>
				</select>
				<hr />
				<p> 你的编程语言? </p>
				<ul id="language">
					<li id="java">Java</li>
					<li>PHP</li>
					<li>C++</li>
					<li>Python</li>
				</ul> <br> <br>
				<hr />
				<p> 个人介绍: </p> <textarea name="person" id="person">个人介绍</textarea>
			</div>
		</div>
		<div id="btnList">
			<div><button id="btn01">查找 id=java 节点</button> </div>
			<div><button id="btn02">查找所有 option 节点</button> </div>
			<div><button id="btn03">查找 name=sport 的节点</button> </div>
			<div><button id="btn04">查找 id=language 下所有 li 节点</button> </div>
			<div><button id="btn05">返回 id=sel01 的所有子节点</button> </div>
			<div><button id="btn06">返回 id=sel01 的第一个子节点</button> </div>
			<div><button id="btn07">返回 id=java 的父节点</button></div>
			<div><button id="btn08">返回 id=ct 的前后兄弟节点</button> </div>
			<div><button id="btn09">读取 id=ct 的 value 属性值</button> </div>
			<div><button id="btn10">设置#person 的文本域</button> </div>
		</div>
	</body>
</html>

XML DOM

概述

W3school在线教程

概念:可扩展标记语言

XML技术可以用于解决什么问题

  • 解决程序间数据传输的问题 => json
  • xml现在主要用来做配置文件(比如我们的tomcat服务器的server.xml,web.xml )
  • xml可以充当小型的数据库 => 程序自己的数据格式存放
<?xml version="1.0" encoding="utf-8" ?>
<!-- 
    xml dom
	文档声明
    xml 表示xml文件
    version 表示版本
    encoding 表示文件编码
 -->
<!--
    students 根目录
    <student></student> 表示子元素
    name,gender,sge 属性
-->
<students>
    <student id="01">
        <name>tom</name>
        <gender></gender>
        <sge>18</sge>
    </student>
    <student id="02">
        <name>marry</name>
        <gender></gender>
        <sge>28</sge>
    </student>
</students>
<!--
    元素语法要求
    每个XML文档必须有且只有一个根元素
    根元素是一个完全包括文档中其他所有元素的元素
 	一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许交叉嵌套
-->

XML 元素命名规则

  • 区分大小写
  • 不能以数字开头
  • 不能包含空格
  • 名字中间不能包含冒号
  • 如果标签需要间隔,建议使用下划线

CDATA 节

概念:有些内容不想让解析引擎执行,而是当作原始内容处理(即当做普通文本),可 以使用 CDATA 包括起来,CDATA 节中的所有字符都会被当作简单文本,而不是 XML 标记

<?xml version="1.0" encoding="UTF-8" ?>
<students>
    <student id="01">
        <name>tom</name>
        <gender></gender>
        <sge>18</sge>
    </student>
    <code> 
        <!-- 如果希望把某些字符串,当做普通文本,使用 CDATA 包括 --> 
        <![CDATA[ 
            <script data-compress=strip> 
            function h(obj){ 
                obj.style.behavior='url(#default#homepage)'; 
                var a = obj.setHomePage('//www.baidu.com/');
            }
            </script>
        ]]> 
    </code>
</students>

转义字符

image-20220420143458974

DOM4j

DOM4j在线文档

概念:Dom4j 是一个简单、灵活的开放源代码的库(用于解析/处理 XML 文件)。Dom4j 是由早期 开发 JDOM 的人分离出来而后独立开发的

Dom4j 是一个非常优秀的 Java XML API,具有性能优异、功能强大和极易使用的特点。 现在很多软件采用的 Dom4j

测试代码

public class dom4j {
    public static void main(String[] args) throws DocumentException {
        // 创建一个解析器
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/student.xml")); // XML Document
        System.out.println();
    }
}

debug生成document树

使用 DOM4J 对 students.xml 文件进行增删改查

查找/获取
public class dom4j {
    public static void main(String[] args) throws DocumentException {
        // 创建一个解析器
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/student.xml")); // XML Document
        // 得到rootElement
        Element rootElement = document.getRootElement();
        // 得到rootElement中students元素
        List<Element> students = rootElement.elements("student");
        for (Element student:students
             ) {
            Element name = student.element("name");
            Element gender = student.element("gender");
            Element age = student.element("age");
            // 获取属性id
            String id = student.attributeValue("id");
            System.out.println(id);
            System.out.println(name.getText()+" "+gender.getText()+" "+age.getText()); // tom 男 18 \n marry 女 28
        }
    }
}
增加元素
public class Dom4jAddElement {
    public static void main(String[] args) throws DocumentException, IOException {
        // 得到解析器
        SAXReader saxReader = new SAXReader();
        Document document = saxReader.read(new File("src/student.xml"));
        // 首先我们来创建一个学生节点对象
        Element newStu = DocumentHelper.createElement("student");
        Element newStu_name = DocumentHelper.createElement("name");
        Element newStu_intro = DocumentHelper.createElement("resume");
        Element newStu_age = DocumentHelper.createElement("age");
        // 如何给元素添加属性
        newStu.addAttribute("id", "03");
        newStu_name.setText("jack");
        newStu_age.setText("23");
        newStu_intro.setText("计算机大佬");
        // 把三个子元素(节点)加到 newStu 下
        newStu.add(newStu_name);
        newStu.add(newStu_age);
        newStu.add(newStu_intro);
        // 再把 newStu 节点加到根元素
        document.getRootElement().add(newStu);
        
        // 直接输出会出现中文乱码
        OutputFormat output = OutputFormat.createPrettyPrint();
        // 设置编码 utf-8
        output.setEncoding("utf-8");
        // 更新 xml 文件
        // 使用到 io 编程 FileOutputStream 就是文件字节输出流
        XMLWriter writer = new XMLWriter( new FileOutputStream(new File("src/student.xml")), output);
        writer.write(document);
        writer.close();
        System.out.println("添加成功~");
    }
}
删除元素
public class Dom4jDeleteElement {
    public static void main(String[] args) throws DocumentException, IOException {
        // 得到解析器
        SAXReader saxReader = new SAXReader();
        Document document = saxReader.read(new File("src/student.xml"));
        // 找到该元素第三个学生
        Element stu = (Element) document.getRootElement().elements("student").get(2);
        // 删除元素
        stu.getParent().remove(stu);
        // 删除元素的某个属性
        stu.remove(stu.attribute("id"));
        
        // 直接输出会出现中文乱码
        OutputFormat output = OutputFormat.createPrettyPrint();
        // 设置编码 utf-8
        output.setEncoding("utf-8");
        // 更新 xml 文件
        XMLWriter writer = new XMLWriter( new FileOutputStream(new File("src/student.xml")), output);
        writer.write(document); writer.close();
        System.out.println("删除成功~");
    }
}
更新元素
public class Dom4jUpdateElement {
    public static void main(String[] args) throws DocumentException, IOException {
        // 得到解析器
        SAXReader saxReader = new SAXReader();
        Document document = saxReader.read(new File("src/student.xml"));
        // 得到所有学生的年龄
        List<Element> students = document.getRootElement().elements("student");
        // 遍历, 所有的学生元素的 age + 3
        for (Element student : students)
        {
            Element age = student.element("age");
            age.setText((Integer.parseInt(age.getText()) + 3) + "");
        }

        // 直接输出会出现中文乱码
        OutputFormat output = OutputFormat.createPrettyPrint();
        // 设置编码 utf-8
        output.setEncoding("utf-8");
        // 更新 xml 文件
        XMLWriter writer = new XMLWriter( new FileOutputStream(new File("src/student.xml")), output);
        writer.write(document); writer.close();
        System.out.println("更新成功~");
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罗念笙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值