学习XML DOM---解析XML文档的典型模型

书接上文:关于XML的结构、特点、属性

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文档。
    1. 首先XML解析器将XML文档加载到XML DOM对象中
    2. XML DOM对象中包含了访问、操作XML文档的方法函数
    3. 然后高级编程语言通过调用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”为属性值创建新的属性
    
  • nodeValuegetAttributeNode()一起使用改变属性的值

    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表示复制被克隆节点的属性和子节点

书接下文:如何通过C#语言解析操作XML文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

咖啡与乌龙

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

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

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

打赏作者

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

抵扣说明:

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

余额充值