《XML数据接口DOM》PPT课件.ppt_第1页
《XML数据接口DOM》PPT课件.ppt_第2页
《XML数据接口DOM》PPT课件.ppt_第3页
《XML数据接口DOM》PPT课件.ppt_第4页
《XML数据接口DOM》PPT课件.ppt_第5页
已阅读5页,还剩49页未读 继续免费阅读

VIP免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八章 XML数据接口DOM,XML DOM 简介,XML文档对象模型(XML Document Object Model)定义了一种访问和处理XML文档的标准方法。 什么是XML DOM? XML DOM是针对XML的文档对象模型(Document Object Model) XML DOM独立于平台和语言 XML DOM定义了一套标准的用于XML的对象 XML DOM定义一种标准的访问XML文档的方法 XML DOM定义了一种标准的处理XML文档的方法 XML DOM是一个W3C标准,XML DOM 节点,节点 根据DOM,XML文档中的每各成分都是一个节点。 DOM是这样规定的: 整个文档是一个文档节点 每个XML标签是一个元素节点 包含在XML元素中的文本是文本节点 每一个XML属性是一个属性节点 注释属于注释节点,XML DOM 节点,Node 层次 节点彼此都有等级关系。 XML文档中的所有节点组成了一个文档树(或节点树)。XML文档中的每个元素、属性、文本等都代表着树中的一个节点。树起始于文档节点,并由此继续伸出枝条,直到处于这棵树最低级别的所有文本节点为止。 术语“父”和“子”被用来描述节点间的关系。某些节点拥有子节点,而另一些节点没有子节点(或称叶节点)。 由于XML数据被组织在树结构中,所以可在不确定树的具体结构以及其中所包含的数据类型的情况下,对XML数据进行遍历。,XML DOM 节点,DOM节点层次范例 此XML文档中的根元素被命名为。所有此文档中的其余的元素都被包含在内部。 元素代表DOM树的根节点。 节点拥有四个子节点。 第一个子节点也含有四个子节点:、以及,它们各自只包含着文本,“Everyday Italian“、“Giada De Laurentiis“、“2005“以及“30.00“。,这幅图展示了来自上面这 个XML文档的DOM节点树 的一个片段:,XML DOM 节点树,一个节点树中的所有节点彼此都是有关系的。 什么是节点树? 一个节点树可以把一个XML文档展示为一个节点集,以及它们之间的连接。 在一个节点树中,最顶端的节点被称为根 每一个节点,除根之外,都拥有父节点 一个节点可以有无限的子 叶是无子的节点 同级节点指拥有相同的父的节点,XML DOM 节点树,这幅图向我们展示了节点树的一个部分,以及上面这个XML文件中节点间的关系。,XML DOM 访问节点,查找并访问节点 你可通过若干种方法来查找您希望操作的元素: 通过使用getElementsByTagName()方法 通过使用一个元素节点的parentNode、firstChild以及lastChild属性,XML DOM 访问节点,getElementsByTagName() getElementsByTagName()方法可在整个文档中查找任何XML元素。 此方法会忽略文档的结构。假如你文档中所有元素,getElementsByTagName()方法会全部找出它们,不管这些元素位于哪个级别。 就是说,这个方法会给您任何您所需要的XML元素,不论它们所处的位置! getElementsByTagName()方法会使用指定的标签名返回所有的元素(作为一个节点列表),这些元素是在使用此方法时所处的元素的后代。,XML DOM 访问节点,getElementsByTagName() 语法 getElementsByTagName(“tagname“); 例子 下面这个例子会返回文档中所有元素的一个节点列表: xmlDoc.getElementsByTagName(“book“);,XML DOM 访问节点,点列表 当使用某个节点列表时,我们通常会把此列表存储在一个变量中,就像这样: var x=xmlDoc.getElementsByTagName(“book“); 现在,变量x包含着页面中所有元素的一个列表,并且我们可通过它们的索引号来访问这些元素。 注释:索引起始于0。 您可以通过使用length属性来循环遍历节点列表: var x=xmlDoc.getElementsByTagName(“book“); for (var i=0;i element 您也可以通过使用索引号来访问某个具体的元素。 要访问第三个元素,您可以这样写: var y=x2;,XML DOM 访问节点,parentNode、firstChild以及lastChild 属性parentNode、firstChild以及lastChild会遵循文档的结构,可在文档中继续进行短距离的旅行。 请看下面的XML片段: Everyday Italian Giada De Laurentiis 2005 30.00 在上面的XML代码中,元素是元素的首个子元素(firstChild),元素是元素的最后一个子元素(lastChild)。 同时,元素是、以及元素的父节点(parentNode),XML DOM 访问节点,根节点 有一个特殊的文档属性可用来访问这些标签: document.documentElement,XML DOM 节点信息,节点信息 每个节点都拥有包含着关于节点某些信息的属性。 这些属性是: nodeName(节点名称) nodeValue(节点值) nodeType(节点类型),XML DOM 节点信息,nodeName nodeName属性含有节点的名称。 元素节点的nodeName是标签名称 属性节点的nodeName是属性名称 文本节点的nodeName永远是#text 文档节点的nodeName永远是#document 注释:nodeName所包含的XML元素的标签名称永远是大写的。 nodeValue 对于文本节点,nodeValue属性包含文本。 对于属性节点,nodeValue属性包含属性值。 nodeValue属性对于文档节点和元素节点是不可用的。,XML DOM 节点信息,nodeType nodeType属性可返回节点的类型。 最重要的节点类型是: 元素类型 节点类型 元素 1 属性 2 文本 3 注释 8 文档 9,XML DOM 节点列表(Node List) 和 指定节点地图(NamedNodeMap),DOM Node List 当我们使用类似childNodes或getElementsByTagName()之类的属性或方法时,就会收到一个NodeList对象。 NodeList对象代表一个有序的节点列表。 可通过它们的索引号码(由0起始)来访问节点列表中的这些节点。 注释:在一个节点列表中,其中的节点是按照它们在XML中被规定的顺序来返回的。,XML DOM 节点列表(Node List) 和 指定节点地图(NamedNodeMap),下面这个XML文件:books.xml 现在,通过使用方法getElementsByTagName(“title“),来创建一个“books.xml“中所有元素的节点列表。下面这幅图表示所返回的节点列表:,XML DOM 节点列表(Node List) 和 指定节点地图(NamedNodeMap),下面这个代码片段可从第一个元素中取得文本: getElementsByTagName(“title“)0.childNodes0.nodeValue 输出: Everyday Italian,XML DOM 节点列表(Node List) 和 指定节点地图(NamedNodeMap),取得节点列表的长度 节点列表可保持其自身的更新。如果某个元素被删除或添加,那么列表会自动更新。 节点列表有一个很有用的属性:length。 length属性可返回某个节点列表中的节点数目。 下面的代码片段可取得“books.xml“中元素的数目: getElementsByTagName(title).length 输出: 4,XML DOM 节点列表(Node List) 和 指定节点地图(NamedNodeMap),当您了解到某个节点列表的长度后,就可以轻易地循环遍历这个列表,并提取您需要的值。 下面的代码片段循环遍历所有的元素,并输出它们的值: /the x variable will hold a NodeList var x=getElementsByTagName(title) for (i=0;i“) 输出: Everyday Italian Harry Potter XQuery Kick Start Learning XML,XML DOM 节点列表(Node List) 和 指定节点地图(NamedNodeMap),DOM NamedNodeMap 当我们对某个元素使用attributes属性时,就会收到一个NamedNodeMap对象。 一个NamedNodeMap代表了属性节点的一个无序列表。 可通过节点名称访问NamedNodeMap中的节点。 注释:在一个NamedNodeMap中,节点不会以任何特别的顺序返回。,XML DOM 节点列表(Node List) 和 指定节点地图(NamedNodeMap),取得NamedNodeMap的长度 NamedNodeMap会保持自身的更新。如果某个元素被删除或添加,此列表也会被自动更新。 NamedNodeMap也拥有length属性。length属性可返回列表中的节点数目。 请看下面这个XML文件:books.xml 下面的这个代码片段可取得“books.xml“中第一个元素的属性数目: getElementsByTagName(title)0.attributes.length 输出: 1,XML DOM 节点列表(Node List) 和 指定节点地图(NamedNodeMap),取得NamedNodeMap中某个项目的值 NamedNodeMap对象的getNamedItem()方法可被用来取回某个指定的节点。 下面的代码片段向我们展示了如何输出每个元素中“category“属性的值: xmlDoc=loadXMLDoc(“books.xml“); var x=xmlDoc.getElementsByTagName(“book“); for(i=0;i“) 输出: COOKING CHILDREN WEB WEB,解析 XML DOM,如需读取、更新、创建或者操作某个XML文档,则需要XML解析器。 解析一个XML文档 如需操作某个XML文档,您需要XML解析器。解析器会将文档载入电脑的内存中。一旦文档被载入,可使用DOM对其数据进行操作。DOM把XML作为一颗树来处理。 微软的XML解析器 微软的XML解析器是存在于IE 5.0或更高版本中的COM组件。一旦你安装了IE,就可使用脚本来利用解析器了。 微软的XML解析器支持所有必要的功能,来遍历节点树,访问节点以及它们的属性值,插入并删除节点,并将节点数转换回XML。,解析 XML DOM,如需创建微软XML解析器的一个实例,请使用下面的代码: JavaScript: var xmlDoc=new ActiveXObject(“Microsoft.XMLDOM“); VBScript: set xmlDoc=CreateObject(“Microsoft.XMLDOM“) ASP: set xmlDoc=Server.CreateObject(“Microsoft.XMLDOM“),解析 XML DOM,下面的代码段可向微软的XML解析器载入一个已有的XML文档(“note.xml“): var xmlDoc=new ActiveXObject(“Microsoft.XMLDOM“); xmlDoc.async=“false“; xmlDoc.load(“note.xml“); 上面的脚本的第一行创建了XML解析器的一个实例。第二行关闭了同步载入,这样可以确保在文档被完全载入前解析器不会继续执行。第三行会告知解析器载入名为“note.xml“的XML的文档。 例8.1,8.2,XML DOM 遍历节点树,遍历节点树 您常常会需要循环遍历XML文档中的元素。 下面的例子可循环遍历的所有子元素,并输出每个节点的节点名以及节点值: 例8.3,XML DOM 节点导航,DOM 节点导航 我们可以通过使用节点彼此间的关系在节点间进行导航: parentNode childNodes firstChild lastChild nextSibling previousSibling,XML DOM 节点导航,下面这幅图展示了节点树的一个部分,以及上面这个XML文件中节点间的关系:,XML DOM 节点导航,取得节点的首个子元素 下面的代码片段可取得的首个子节点: /检测首个子节点是否是元素节点 function get_firstchild(n) var x=n.firstChild; while (x.nodeType!=1) x=x.nextSibling; return x; xmlDoc=load(“books.xml“); var y=get_firstchild(xmlDoc.documentElement); document.write(y.nodeName); 以上代码的输出: book,这个例子中的函数可检测第一个子节点的节点类型。 元素节点的节点类型是1,因此如果首个子节点不是元素节点,它就会移至下一节点并检查此节点是否是元素节点。这个过程会持续到首个元素被找到为止。,XML DOM 节点导航,取得节点的前一个同级节点 下面这个代码片段会取得第一个 元素的前一个同级节点: /check if the previous sibling node is an element node function get_previoussibling(n) var x=n.previousSibling; while (x.nodeType!=1) x=x.previousSibling; return x; xmlDoc=load(“books.xml“); var x=xmlDoc.getElementsByTagName(“author“)0; var y=get_previoussibling(x); document.write(y.nodeName); 以上代码的输出: title,这个例子中的函数可检测前一个同级节点的节点类型。 假如前一个同级节点不是一个元素节点,它就会移至下一个前面的同级节点,并检查此节点是否是元素节点。这个过程会持续到前一个同级的元素节点被找到为止。,XML DOM 取得节点,取得某个元素的值 getElementsByTagname()方法可返回一个节点列表,其中包含着所有通过指定标签名找到的元素,这些元素的排列顺序与它们在源文档中出现的顺序相同。 例8.4 使用getElementsByTagname()方法来取得“books.xml“中所有“title“元素的值。,XML DOM 取得节点,取得某个属性的值 getAttribute()方法可被用来显示某个属性的值。 例8.5 使用getAttribute()方法来取得“books.xml”中所有“category”属性的值。 取得某个项目的值 getNamedItem()方法可被用来找回某个指定的节点。 例8.6 用getNamedItem()方法来取得“books.xml“中所有“category“属性的值。,XML DOM 设置节点,设置一个新的属性以及属性值 setAttribute()方法可被用来改变现有属性的值,或者为某个元素创新一个新的属性/属性值。 例8.7 使用setAttribute()来设置新的属性/属性值。 另一种创建新属性的方法 createAttribute()可被用来创建一种新的属性节点。 例8.8 使用createAttribute()来创建一个新的属性节点,并使用setAttributeNode()将此节点插入一个元素中。,XML DOM 设置节点,改变一个属性值 setAttribute()方法可被用来改变某个现有属性的值,或者为一个元素创建一个新的属性/属性值。 例8.9 使用setAttribute()方法来改变现有属性的值。 改变一个项目的值 getNamedItem()方法可被用来改变某个现有项目的值。 例8.10 使用getNamedItem()方法来改变现有属性的值。,XML DOM 删除节点,删除某个元素 removeChild()可被用来删除某个指定的节点。 例8.11 使用 removeChild()从载入的XML中删除最后一个元素。 从元素删除文本 deleteData()方法被用来从文本节点删除数据。 deleteData()方法有两个参数: offset - 从何处开始删除字符。偏移量的起始值是0 count - 删除多少字符 例8.12 使用deleteData()从已载入的XML中的一个文本节点删除文本。,XML DOM 删除节点,删除属性 removeAttribute()方法被用来删除属性节点。根据属性名。 例8.13 使用removeAttribute()从已载入的XML中删除所有的“category”属性。 removeAttributeNode() removeAttributeNode()方法被用来删除某个属性节点。根据对象。 例8.14 使用removeAttributeNode()从已载入的XML中删除所有的“category“属性。,XML DOM 替换节点,替换节点列表中的某个节点 replaceChild()方法被用来替换节点列表中的某个节点。 例8.15 使用replaceChild()来替换节点列表中的最后一个子节点。 替换文本节点中的数据 replaceData()方法被用来替换文本节点中的数据。 replaceData()方法有三个参数: offset - 从何处开始替换字符。偏移量的起始值为0 length - 替换多少字符 string - 要插入的字符串 例8.16 使用replaceData()来替换文本节点中的数据。,XML DOM 创建节点,创建一个元素 createElement()方法可创建一个新的元素节点。 例8.17 使用createElement()来创建一个新的元素节点,并使用appendChild()将此节点添加到一个节点列表中。 创建一个属性 createAttribute()可创建一个新的属性节点。 例8.18 使用createAttribute()来创建一个新的属性节点,并使用setAttributeNode()将此节点插入一个元素中。,XML DOM 创建节点,创建一个文本节点 createTextNode()方法可创建一个新的文本节点。 例8.19 使用createTextNode()来创建一个文本节点,并使用appendChild()将此节点添加到一个节点列表中。 创建一个CDATA Section节点 createCDATASection()方法可创建一个新的CDATA Section节点。 例8.20 使用createCDATAsection()来创建一个CDATA section节点,并使用appendChild()将此节点添加到一个节点列表中。,XML DOM 创建节点,创建一个注释节点 createComment()方法可创建一个新的注释节点。 例8.21 使用createComment()来创建一个注释节点,并使用appendChild()将此节点添加到一个节点列表中。,XML DOM 添加节点,向一个节点列表的末尾添加一个节点 appendChild()方法可用来在某个特定的节点之后添加一个节点。 此方法在被添加节点的位置不很重要的情况下是很有用的。 例8.22 使用createElement()来创建一个新的元素,并使用appendChild()将此节点添加到一个节点列表。 在某个特定的节点之前插入节点 insertBefore()可用来在某个特定的节点之前插入一个节点。 此方法在被添加节点的位置很重要的情况下是很有用的。 例8.23 使用createElement()来创建一个新的元素,并使用insertBefore()将此节点插入到特定的节点之前。,XML DOM 添加节点,设置新的属性和属性值 setAttribute()方法可被用来改变已有属性的值,或者为某个元素创建新的属性/属性值。 注释:假如“edition”属性已存在,setAttribute()方法将重写此属性的值。 例8.24 使用setAttribute()方法来设置新的属性/属性值。 向某个文本节点插入数据 insertData()方法可用来向某个文本节点插入数据。 insertData()方法有两个参数: offset - 从何处开始插入字符。偏移量的起始值是0 string - 要插入的字符串 例8.25 使用insertData()向一个文本节点插入数据。,DOM 克隆节点,复制节点 cloneNode()方法可创建一个指定节点的备份。 cloneNode()方法有一个参数(true 或 false)。此参数可指示被克隆节点是否应包括原节点的所有属性和子节点。 例8.26 使用cloneNode()来复制节点,并把它添加到一个节点列表。,使用JavaScript验证XML文档,在载入及验证XML数据的过程中,可能会由于不同的原因而抛出错误。 例如:外部的XML文件找不到,或者XML的格式不正确,验证出错等。 为了处理这些情况,MSXML提供了一个包含错误信息的对象parseError对象。 用户可以通过parseError对象提供的与整数0进行比较的errorCode属性来检查错误。最有当errorCode为0时才表示没有错误发生。 例: var sXml=“Jeremy McPeak”; var oXmlDom=new ActiveXObject(“Msxml2.DOMDocument.4.0”); oXmlDom.load(sXml); if(oXmlDom.parseError.errorCode!=0) alert(“An Error Occurred: “+oXmlDom.parseError.reason); else /当载入XML数据成功后 ,使用JavaScript验证XML文档,parseError对象提供了一下属性,能够帮助人们更好的理解错误: errorCode:错误代码(长整型); filePos:在文件中发生错误的位置(长整型); line:包含错误的代码行的行号(长整型); position:在特定行中发生错误的位置(长整型); reason:错误的原因(字符串型); srcText:发生错误的代码行内容(字符串型); url:XML文档的URL(字符串型)。,使用DOM验证XML文档对于DTD的有效性,人们可以使用XML DOM对象中的DOMDocument对象和IXMLDOMParseError对象来验证XML文档对于DTD内容的有效性。 例11-4,使用DOM验证XML文档对XML模式的有效性,可以使用MSXml提供的XML DOM对象来验证XML文档对于XML模式的有效性。 用到一个很重要的XML DOM对象XMLSchemaCache对象。 XMLSchemaCache对象常用的方法如下: add(namespaceURI,variable):添加一个新模式到模式集中,并把特定的命名空间与模式相关联。 addCollection(XMLSchemaCollection object):添加其他的模式集到XMLSchemaCache对象中,保证不同模式的命名空间不会冲突。 Get(namespaceURI):该方法返回含有元素的节点。 namespaseURI(index number):该方法删除模式集中的指定模式。,使用DOM验证XML文档对XML模式的有效性,XMLSchemaCache对象有一个属性length,该属性返回包含在模式集中模式的个数。 创建XMLSchemaCache对象的代码: var xsdSchemacache=new ActiveXObjet(“Msxml2.XMLSchemaCache.4.0”); /创建DOMDocument对象实体 var xmldoc=new ActiveXObject(“Msxml2.FreeThreadedDOMDocument.4.0”); xmldoc.validateOnParse=true; xmldoc.load(“要验证的XML文档”); 创建了各种对象的实例并载入DOMDocument对象中后,需要把模式与XML文档相关联。因此需要添加一个新模式到XMLSchemaCache对象中。 var namespace=spaceURI; xsdSchemacache.add(namespace,”要关联的模式文件”); 例11-5,使用演示表实时处理XML文档,使用XML DOM,可以对XML文档中的数据进行读、写、修改等操作。 人们也可以借助XML DOM对象实时的把XSLT样式表和XML文档相关联。 这需要

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论