使用DOM解析XML文档
parentNode childNodes firstChild lastChild nextSibling previousSibling 获取父节点 获取子节点集合 获取第一个子节点 获取最后一个子节点 获取同级别中后一个节点 获取同级别中前一个节点
节点之间的关系
功能
节点操作
访问节点
JavaScript实现DOM 访问节点 C#实现DOM访问节点
加载XML文档 加载 文档
loadXml()方法加载XML字符串
IE浏览器
Firefox浏览器
XmlDocument xmlDoc = new XmlDocument(); xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); C#语言加载XML字符串 parser=new DOMParser(); xmlDoc.LoadXml(text); xmlDoc.async="false"; xmlDoc=parser.parseFromString(text,"text/xml"); xmlDoc.loadXML(text);
DOM(文档对象模型)定义了访问XML 和 XHTML 等文档的标准 XML DOM 定义了所有 XML 元素的对象和属性,以及访问的方法(接口)
检查文档是否格式良好
XML文档
XML解析器
DOM树
应用程序
加载文档并创建节点树
通过标准接口访问文档
DOM简介 简介
DOM级别(规范)
DOM级别指W3C组织的DOM规范,W3C组织为DOM规范定义了3个级别
解析XML文档 第2章 使用 章 使用DOM解析 解析 文档
课程回顾
一个XML文档由元素、属性、实体、CDATA、PCDATA构成 DTD使用一系列合法的元素来定义文档的结构,使用的主要标记包括:
<!DOCTYPE>定义文档的类型 <!ELEMENT>定义文档元素 <!ATTRIBUTE>定义文档的属性 <!ENTITY>定义实体
2.2 加载XML文档 加载 文档
使用load()方法加载XML文档
兼容IE和Firefox浏览器 C#语言在服务器端加载XML文档 Firefox、Mozilla、 IE浏览器
Opera等浏览器
try{ xmlDoc=new xmlDoc = new XmlDocument(); XmlDocumentActiveXObject("Microsoft.XMLDOM"); xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); }xmlDoc=document.implementation.createDocument("","",null); xmlDoc.Load("books.xml"); catch(e){ xmlDoc.async="false"; xmlDoc.async="false"; try{ xmlDoc=document.implementation.createDocument("","",null); xmlDoc.load("books.xml"); } xmlDoc.load("books.xml"); catch(e) {alert(e.message)} } try{ xmlDoc.async=false; xmlDoc.load("books.xml"); }
节点和节点树
节点之间的关系描述如下:
在节点树中,顶端的节点成为根节点 根节点之外的每个节点都有一个父节点 节点可以有任何数量的子节点 叶节点是没有子节点的节点 同级节点是拥有相同父节点的节点
使用DOM可以在不了解节点树的确切结构以及其中包含的数据类型的情 况下,对其进行遍历
小结1 小结
XML DOM是什么? 节点树的节点之间有哪几种关系?alue属性来修改文本节点和属性节点的, 或者通过setAttribute()方法修改属性的值
与DTD相比, XML Schema具有以下优点:
支持更丰富的数据类型 可针对未来的需求进行扩展 比DTD更完善,功能更强大 基于 XML 编写,比DTD语法更简单 支持命名空间
所有XML Schema的根元素都是<schema>,外部schema以.xsd文件为后 缀名 XML Schema使用<simpleType>定义简单类型 XML Schema使用<complexType>定义复杂类型
setAttributeNode(att_node) 创建一个注释节点
var node=xmlDoc.getElementsByTagName("book")[0]; insertBefore(newNode,refNode) 在指定的子节点之前插入节点
insertAfter(newNode,refNode) node.appendChild(ele); insertData(offset,string) 在指定的子节点之后插入节点 将元素ele添加到 将数据插入已有的文本节点中 node的子元素末尾
createComment(data)
XmlAttribute att = xmlDoc.CreateAttribute("pubdate"); 将属性节点添加到一个元素节点中 "2008att.Value==xmlDoc.createAttribute("pubdate"); "2008-1-9"; var att setAttribute(name,value) 为一个元素创建一个新的属性节点 ele.SetAttributeNode(att); createTextNode(data)"2008-1-9"; 创建一个文本节点 att.nodeValue = "2008将属性节点添加 XmlNode node = xmlDoc.GetElementsByTagName("book")[0]; createCDATAsection(data) 创建 CDATA节点 到元素节点中 ele.setAttributeNode(att); node.AppendChild(ele);
2. DOM编程接口 编程接口
2.1 XML DOM 对象
XML DOM对象中封装了常用的操作XML文档的属性和方法
XML DOM Attr 对象:表示 Element 对象的属性 XML DOM CDATASection 对象:表示文档中的 CDATA 段 XML DOM Comment 对象:表示文档中注释节点的内容 XML DOM Document 对象:表示整个 XML 文档 XML DOM DOMParser 对象:该对象通过解析XML 标记来创建一个文档 XML DOM Element 对象:表示 XML 文档中的元素 XML DOM NamedNodeMap 对象:表示一个无序的节点列表 XML DOM Node 对象:表示文档树中的一个节点 XML DOM NodeList 对象:表示一个有序的节点列表 XML DOM Text 对象:表示元素或属性的文本内容 XML DOM XMLHttpRequest 对象
本章内容
文档对象模型 节点和节点树 使用DOM加载XML文档 使用DOM访问、创建和修改节点
本章目标
理解文档对象模型 理解节点和节点树 能够使用JavaScript语言和C#语言解析XML文档
加载文档 添加节点 删除节点 修改节点 替换节点 复制节点
1. DOM及其模型 及其模型
1.1 DOM简介
DOM 级别 1
DOM 级别 2
DOM 级别 3
1.2 节点和节点树
依据DOM的规定,XML文档中每个单元都是节点
整个文档是一个文档节点 每个 XML 标签是一个元素节点 包含在 XML 元素中的文本是文本节点 每一个 XML 属性是一个属性节点 注释属于注释节点
XML DOM将 XML 文档视为一种树结构
XmlNodeList nlist = xmlDoc.GetElementsByTagName("book")[0].ChildNodes; 遍历第一个book元素 XmlNode node = xmlDoc.GetElementsByTagName("book")[0].FirstChild; var nlist=xmlDoc.getElementsByTagName("book")[0].childNodes; 的所有子节点 //C#使用Count属性获取集合元素个数 var node=xmlDoc.getElementsByTagName("book")[0].firstChild; for nlist.Count; for (int i i=0;i<nlist.length;i++){ (var = 0; i < nlist.Count i++) { if (node.nodeType==1){ //XmlNodeType是C#枚举 ifdocument.write(node.nodeName); (node.NodeType == XmlNodeType.Element XmlNodeType.Element) 输出每个属性节点的值 } { Console.WriteLine( ); var att=node.attributes; } for(var j=0;j<att.length;j++){ var att = node.Attributes; document.writeln("<br/>元素"+node.nodeName+"有属性 for (int j = 0; j < att.Count; j++) "+att[i].nodeName+"="+att[i].nodeValue); { } Console.WriteLine("元素" + + "有属性" + att[i].Name + "=" + att[i].Value att[i].Value); 将当前节点的同级下个节 document.write("<br/>"); } 点作为操作节点 node=node.nextSibling; Console.WriteLine(); } node = node.NextSibling; }