XML DOM学习笔记
如果希望解析、读取、写入XML,那么就要学习XML DOM
1.XML DOM是啥?
- XML DOM 定义了所有XML元素的对象和属性,以及访问他们的方法(接口)
- XML DOM 是用于获取、更改、添加、删除XML元素的标准
2.XML DOM节点
-
文档节点、元素节点、文本节点(元素中的文本)、属性节点、注释节点
-
注意:文本是直接存储在文本节点中,文本节点存储在元素节点中
<book>
<title>三国演义</title>
</book>
3.DOM 节点树
- XML DOM 把 XML 文档视为一种树结构。这种树结构被称为节点树,XML数据是按照树的形式进行构造的
- 可通过这棵树访问所有节点。可以修改或删除它们的内容,也可以创建新的元素
- 这里的树中的父节点、子节点、同级(兄弟)节点的概念和数据结构中的树相同
<bookstore>
<book category="cooking">
<title lang="en">Everyday Italian</title> //第一个子节点
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price> //最后一个子节点
</book>
</bookstore>
4.XML 解析器
- 工作原理:高级编程语言通过XML 解析器,去访问和操作XML文档。
- 首先XML解析器将XML文档加载到XML DOM对象中
- XML DOM对象中包含了访问、操作XML文档的方法函数
- 然后高级编程语言通过调用XML DOM中的方法去访问XML的各个节点
5.XML 属性和方法
-
XML DOM的属性和方法定义了编程接口
-
典型属性(这里的属性指的是面向对象语言的属性,而不是XML元素的属性)
-
典型方法
-
XML DOM中每一个节点都是一个对象,其拥有:
-
重要属性:
-
nodeName:
只读、文本节点的nodeName是#text、文档节点的nodeName是#document -
nodeValue:
可读可写、文本节点的nodeValue是文本本身、属性节点是属性的值 -
nodeType:
-
-
6.XML DOM的节点列表(Node List)
节点列表
由getElementsByTagName()
方法和childNodes
属性返回特点:
- 列表中节点的顺序与XML文档为准、索引从0开始
- 如果删除或添加了元素,列表会自动更新
7.XML DOM属性列表(js代码)
-
属性列表
由getElementsByTagName()
方法和attributes
属性返回 -
再通过类似
map
键值对的方式,以属性值作为key
检索相应的属性调用函数getNameItem()
xmlDoc=loadXMLDoc("books.xml"); x=xmlDoc.getElementsByTagName("book")[0].attributes; document.write(x.getNamedItem("category").nodeValue); document.write("<br>" + x.length);
8.XML DOM遍历节点树(js代码)
var x, i ,xmlDoc;
var txt = "";
var text = "<book>" +
"<title>Everyday Italian</title>" +
"<author>Giada De Laurentiis</author>" +
"<year>2005</year>" +
"</book>"; // 创建一个XML形式的字符串
parser = new DOMParser(); //实例化一个DOM解析器
xmlDoc = parser.parseFromString(text,"text/xml"); //使用解析器解析XML字符串
x = xmlDoc.documentElement.childNodes; //documentElement 表示根节点
for (i = 0; i < x.length ;i++) {
txt += x[i].nodeName + ": " + x[i].childNodes[0].nodeValue + "<br>";//累加
}
document.getElementById("demo").innerHTML = txt;//显示
9.通过节点属性找其他节点
parentNode
:找当前节点的父节点childNodes
:找当前节点的子节点,返回一个节点列表firstChild
lastChild
nextSibling
:当前节点的下一个兄弟节点previousSibling
:当前节点的上一个兄弟节点
10.对节点进行操作(js代码)
10.1 获取节点值
-
nodeValue
属性用于获取节点的文本值- 元素节点没有文本值
xmlDoc = loadXMLDoc("book.xml"); x = xmlDoc.getElementsByTagName("title")[0]; y = x.childNodes[0]//文本节点 txt = y.nodeValue;
-
getAttribute()
方法返回属性的值- 属性节点有文本值
xmlDoc = loadXMLDoc("book.xml"); txt = xmlDoc.getElementByTagName("title")[0].getAttribute();
-
getAttributeNode()
方法返回属性节点xmlDoc = loadXMLDoc("book.xml"); x = xmlDoc.getElementByTagName("title")[0].getAttributeNode("lang");//lang是属性名 txt = x.nodeValue;
10.2 修改节点值
-
nodeValue
属性用于修改节点的文本值x.nodeValue="Easy Cooking";//通过直接赋值的方式
-
setAttribute()
方法改变已有属性的值或者创建新属性// 改变 x=xmlDoc.getElementsByTagName('book');//标签为book的元素节点列表 x[0].setAttribute("category","food"); //改变 // 创建 如果属性不存在,则以“category”为属性名,“food”为属性值创建新的属性
-
nodeValue
和getAttributeNode()
一起使用改变属性的值x=xmlDoc.getElementsByTagName('book'); y=x[0].getAttributeNode("category"); y.nodeValue = "food";
10.3 删除节点值
-
removeChild()
方法删除指定节点,参数为待删除结点- 当一个节点被删除时,其所有的子节点也会被删除
x=xmlDoc.getElementsByTagName('book')[0]; // 把x设置为要删除的节点 xmlDoc.documentElement.removeChild(x); // 删除节点x x.parentNode.removeChild(x); // 先导航到x的父节点,再删除x子节点(自己删除自己) y = x.childNodes[0]; x.removeChild(y); // 删除文本节点
-
nodeValue
属性值代替的方式,删除一个文本节点xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue = ""; //xmlDoc代表XML文件对象 //xmlDoc.getElementsByTagName("title")代表标签为“title”的元素列表 //xmlDoc.getElementsByTagName("title")[0]代表元素列表的第一个元素---一个标签为“title”的元素 //xmlDoc.getElementsByTagName("title")[0].childNodes代表标签为“title”的元素的子节点列表,文本节点 //xmlDoc.getElementsByTagName("title")[0].childNodes[0]代表文本节点列表的第一个元素 //xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue代表第一个文本节点的值
-
removeAttribute(attribute_name)
根据名称删除属性节点x[0].removeAttribute("category");
-
removeAttributeNode(node)
根据节点删除节点的所有属性
10.4 替换节点值
-
replaceChild()
方法替换指定节点xmlDoc=loadXMLDoc("books.xml"); // 加载XML文件到对象xml Doc x = xmlDoc.documentElement; // x为根节点 // 创建新的book元素、title元素、node节点 newNode = xmlDoc.createElement("book"); // 创建book元素 newTitle = xmlDoc.createElement("title");// 创建title元素 newText = xmlDoc.createTextNode("A Notebook");//创建文本节点 // 通过添加构成父子关系 newTitle.appendChild(newText); // 将文本节点添加进newTitle元素中 newNode.appendChild(newTitle); // 将title元素添加到newNode中 // 替换节点 y = x.getElementByTagName("book")[0]// y为第一个子节点 x.replaceChild(newNode,y);//将x的子节点y替换replace为newNode
-
nodeValue
属性替换文本节点中的文本(同10.3的用法)
10.5 创建节点
createElement()
方法创建一个新的元素节点createAttribute()
用于创建一个新的属性节点,先创建再赋值createTextNode()
方法创建一个新的文本节点createCDATASection()
方法创建一个新的 CDATA section 节点createComment()
方法创建一个新的注释节点
10.6 添加节点
-
appendChild()
方法:若x对象
调用该方法,则在x对象
已有的节点后添加一个子节点 -
insertBefore(node1,node2)
方法:若x对象
调用该方法,则在node2
子节点之前插入node1
子节点 -
insertData()
方法将数据插入已有的文本节点中x=xmlDoc.getElementsByTagName("title")[0].childNodes[0]; x.insertData(0,"Easy "); // 在0位置开始,插入"Easy "字符串
10.7 克隆节点
cloneNode(true/false)
方法创建指定节点的副本;true
表示复制被克隆节点的属性和子节点