使用dom4j解析处理html时,遇到了一些问题:
取出来Node对象(比如一个table),再往下取时,再用node1.selectNodes会取不到东西(实际上取出来的是一个空的文本节点),所以最好转为Element,就很容易了,element1.elements("tr"),就可以方便地循环了,比较奇怪的是转换为Element的方法居然是强转-_-!
Element table1 = (Element) tables.get(0);
这就导致我对Element和Node 的区别产生了一定的问题?查阅了一定的资料,总结了如下一些规律:
下面是一段代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="parentDiv">
<!--注释-->
<div></div>
</div>
<script>
console.log(document.getElementById('parentDiv').childNodes); //NodeList[5]
console.log(document.getElementById('parentDiv').children) ; //HTMLCollection[1]
</script>
</body>
</html>
控制台输出如图所示:
childNodes属性返回的是NodeList数组,是属于节点(也包括元素)的属性,而children属性返回的是子元素,是属于元素的属性。而在Nodelist数组里面也有元素存在,证明了元素也是节点的一种,即元素节点。
W3C中的解释是:
在 HTML DOM (文档对象模型)中,每个部分都是节点:
文档本身是文档节点
所有 HTML 元素是元素节点
所有 HTML 属性是属性节点
HTML 元素内的文本是文本节点 (包括回车符也是属于文本节点)
注释是注释节点
Element 对象可以拥有类型为元素节点、文本节点、注释节点的子节点。
NodeList 对象表示节点列表,比如 HTML 元素的子节点集合。
元素也可以拥有属性。属性是属性节点。
总结:元素是元素节点,是节点中的一种,但元素节点中可以包含很多的节点。