XML 编程与应用教程811章.ppt_第1页
XML 编程与应用教程811章.ppt_第2页
XML 编程与应用教程811章.ppt_第3页
XML 编程与应用教程811章.ppt_第4页
XML 编程与应用教程811章.ppt_第5页
已阅读5页,还剩59页未读, 继续免费阅读

下载本文档

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

文档简介

第8章xmldom编程模型,目标,理解dom模型解析xml文档,生成文档对象操纵dom模型的对象、接口、属性、方法,8.1文档对象模型概述,dom(documentobjectmodel)定义了文档的逻辑结构和访问、操纵文档的方法。它为xml、html提供了应用程序接口api。dom中的对象允许开发者从文档中读取、搜索、修改、增加和删除数据它们为文档导航提供了标准的功能定义,并且操纵xml文档的内容和结构。dom提供的对象和方法可以和任何编程语言(java、c+、vb)一起使用,也可以与vbscript、javascript脚本语言一切使用。,8.2xml解析器,domsaxjdomdom4j,8.3dom解析树,最常见的节点类型:元素:元素是xml的基本构件。元素可以有其它元素、文本节点或两者兼有来作为其子节点。元素节点还是可以有属性的唯一类型的节点。属性:属性节点包含关于元素节点的信息,但实际上,不认为它是元素的子节点文本:文本节点是:文本。它可以包含许多信息或仅仅是空白。文档(根节点):文档节点是整个文档中所有其它节点的父节点。(根节点不等于根元素节点!)较不常见的节点类型:cdata、注释、处理指令,xml文档,曹雪芹红楼梦孙更新xml实用大全,dom解析树,msxml解析xml文档的过程,8.4msxmldom模型结构,xmldom提供让你遍历、读取和操纵xml文档的结构和内容,其主要对象和方法有:domdocument对象:描述全部文档映射表,它包括文档所有信息。ixmldomnode对象:描述文档里的节点,此节点可以是元素、属性、处理指令、文本或其他存储在xml文档里的信息。ixmldomnodelist对象:描述节点对象的集合,可以使用该对象遍历这个集合,可以用数值访问。ixmldomparseerror对象:用来验证xml文档对于dtd、xsd的正确性。,8.4.1domdocument对象,domdocument对象表示dom树的最顶层节点,它实现了使用xml文档所需的所有方法:createelement(elementname):创建以元素名命名的节点,但名称空间受限制的元素除外createattribute(attributename):创建以属性名命名的属性节点createcomment(text):创建注释节点createtextnode(text):创建正文节点,createnode(type,name,namespace-uri):建节点,type可以是1(元素)、2(属性),3(文本节点),name为节点名,namespace-uri为名称空间。getelementsbytagname(elementname):elementname代表要搜索的元素,返回ixmldomnodelist对象包含的节点集合。load(xmldocment):有2种方法可以载入xml文件。例docobj.load(“http:,loadxml(string):把成形的代码或整个xml文档载入domdocument对象中。transformnode(stylesheetobject):把样式表加到xml文档上处理节点,返回转换结果。appendchild(childnode):把用createnode()或createelement()方法创建的节点或元素,追加到树形结构上。save(destination):把domdocument对象保存到指定目的地。例docobj.save(“,domdocument对象的属性,async:指定是否允许异步加载,取布尔值。如果为true,即使文档仍在载入,脚本也会继续执行;为false时,脚本会等待文档全部被载入后才会执行代码。一般用docobj.async=falsechildnodes:返回属于父节点的子节点。其值是ixmldomnodelist类型。例varfirstelem=docobj.childnodes.item(0)documentelement:包含用domdocument表示的xml文档的根元素。例varroot=docobj.documentelementfirstchild:返回父元素的第一个子节点,该属性是只读的。例varfirstelem=firstchildlastchild:返回父元素的最后一个子节点。例varfirstelem=lastchild,parseerror:该属性返回一个包含大部分最近产生的错误信息的对象。例varerror=docobj.parseerrorreadystate:返回文档的状态,1正在载入中;2已下载;3对话;4结束。例varstateinfo=docobj.readystatexml:返回一个节点及其子节点的xml表示。例document.write(docobj.xml)validateonpage:指定解析器是否在解析xml文档时验证其合法性。例docobj.validateonpage=true,8.4.2ixmldomnode对象,ixmldomnode对象代表xml文档树形结构中的一个单个节点,它可能包含其他子节点的元素。使用方法有:appendchild(newchild):把newchild加到使用节点的子节点的末尾。insertbefore(newnode,refnode):把newnode插在已存节点refnode之前。removechild(nodename):删除指定节点。replacechild(newnode,oldnode):替换节点。haschildnode():查找子节点。clonenode(boolean):克隆节点,如为true,返回ixmldomnode对象的完全克隆。,ixmldomnode属性,nodename:返回节点名称。nodetype:返回节点类型。nodevalue:返回节点包含的文本。childnodes:返回节点的子节点数。firstchild:返回该节点的第一个子节点。lastchild:返回该节点的最后一个子节点。text:返回在ixmldomnode对象中的文本。xml:返回ixmldomnode对象的代码。,8.4.3ixmldomnodelist对象,为了操纵xml文档,ixmldomnodelist对象提供存在于xml文档中的节点集合。节点集对象的改变立即反映到节点集上。ixmldomnodelist对象也可以遍历节点集。方法1:item(number),返回指定数值对应位置的节点。方法2:nextnode(),返回节点集的下一个节点。使用ixmldomnodelist属性length可以获得节点集中节点的个数。,8.4.4ixmldomparseerror对象,ixmldomparseerror对象返回大部分最近发生的解析错误。ixmldomparseerror对象提供各种属性来检索错误,如错误代码、错误内容、引起错误的行代码等。errorcode:该属性包含长整形错误代码,没有错误,返回0。reason:该属性包含解释错误原因的字符串。line:该属性存储代表错误行数的长整形。linepos:该属性存储代表错误位置的长整形。srctext:该属性包含引起错误的那一行字符串。,8.5dom编程步骤,dom编程第一步就是确保机器上安装了microsoftxml4.0(或更高版本)。在msxml解析器的使用过程中,我们可以使用文档中的createelement方法创建一个节点来装载和保存xml文件,也可以通过load或者是loadxml方法从一个指定的url来装载一个xml文档。save方法是用来把文档保存到一个指定的位置。save方法中参数destination用来表示需要被保存的对象的类型,对象可以是一个文件、一个aspresponse方法、一个xml文档对象,或者是一个能够支持持久保存(persistence)的客户对象。,使用javascript编写生成dom文档对象的方法,varxmldoc=newactivexobject(msxml2.domdocument.4.0);xmldoc.async=false;xmldoc.load(candidate.xml);,生成xml文档对象xmldoc,xmldoc中包含xml文档中所有元素和节点,装载xml文档完毕后才开始处理下一步骤,将xml文档装载到文档对象中,在内存中形成文档对象树,8.6本章小结,dom为处理xml文档提供了可编程的方法。dom允许我们在客户端和服务器端修改xml数据结构。dom为数据库之间的信息传递提供了理想的机制。dom在不同的平台上可以有不同的实现方式。dom是内存密集型操作,它不适于处理大型xml文件。,第9章java中的xml编程,9.1使用dom解析xml,解析器工厂类documentbuilderfactorydocumentbuilderfactory类是dom中的解析器工厂类,开发这要使用dom操作xml首先必须需要建立一个解析器工厂实例,以便利用这个工厂类实例来获得一个具体的解析器对象。示例代码如下:documentbuilderfactorydbf=documentbuilderfactory.newinstance();解析器类documentbuilderdocumentbuilder类是dom中的解析器类,开发者可以使其从xml文档获取dom文档实例。当获得一个解析器工厂类对象后,使用它的静态方法newdocumentbuilder()将可以获得一个dom解析器对象,示例代码如下:documentbuilderdb=dbf.newdocumentbuilder();,文档树模型document3-1,document对象代表了一个xml文档的树模型。所有其它的node,都以一定的顺序包含在document对象之内,排列成一个树形的结构,以后所有的对xml文档的操作,都与解析器无关,直接在这个document对象上进行操作就可以了。,文档树模型document3-2,解析器类documentbuilder的parse()方法接受一个xml文档名作为输入参数,将返回一个document实例示例代码:documentdoc=db.parse(message.xml);此外还可以把要解析的xml文档转化为输入流,然后将输入流对象作为parse()方法的输入参数,以便dom解析器解析它,示例代码如下:inputstreamis=newfileinputstream(message.xm);documentdoc=db.parse(is);使用document对象的getelementsbytagname()方法,可以得到一个nodelist对象,一个node对象代表了一个xml文档中的一个标签元素,而nodelist对象所代表的是一个node对象的列表。下面示例代码得到的是xml文档中所有标签对应的node对象的一个列表。nodelistnl=doc.getelementsbytagname(message);,文档树模型document3-3,除了查找节点工作之外,document还包含了创建其它节点的方法,比如createattribut()用来创建一个attr对象。它所包含的主要的方法有:createattribute(string):用给定的属性名创建一个attr对象,并可在其后使用setattributenode方法来放置在某一个element对象上面。createelement(string):用给定的标签名创建一个element对象,代表xml文档中的一个标签,然后就可以在这个element对象上添加属性或进行其它的操作。createtextnode(string):用给定的字符串创建一个text对象,text对象代表了标签或者属性中所包含的纯文本字符串。如果在一个标签内没有其它的标签,那么标签内的文本所代表的text对象是这个element对象的唯一子对象。getelementsbytagname(string):返回一个nodelist对象,它包含了所有给定标签名字的标签。getdocumentelement():返回一个代表这个dom树的根节点的element对象,也就是代表xml文档根元素的那个对象。,节点列表类nodelist,节点列表类nodelist就是代表了一个包含一个或者多个node的列表。可以简单的把它看成一个node的数组,可以通过下列方法来获得列表中的元素:getlength():返回列表的长度。item(int):返回指定位置的node对象。可以使用nodelist对象的item()方法来得到列表中的每一个node对象,节点类node2-1,node对象代表了文档树中的一个抽象的节点。node对象所包含的主要的方法有:appendchild(org.w3c.dom.node):为这个节点添加一个子节点,并放在所有子节点的最后,如果这个子节点已经存在,则先把它删掉再添加进去。getfirstchild():如果节点存在子节点,则返回第一个子节点,对等的,还有getlastchild()方法返回最后一个子节点。getnextsibling():返回在dom树中这个节点的下一个兄弟节点,对等的,还有getprevioussibling()方法返回其前一个兄弟节点。getnodename():根据节点的类型返回节点的名称。getnodetype():返回节点的类型。getnodevalue():返回节点的值。,节点类node2-2,haschildnodes():判断是不是存在有子节点。hasattributes():判断这个节点是否存在有属性。getownerdocument():返回节点所处的document对象。insertbefore(org.w3c.dom.nodenew,org.w3c.dom.noderef):在给定的一个子对象前再插入一个子对象。removechild(org.w3c.dom.node):删除给定的子节点对象。replacechild(org.w3c.dom.nodenew,org.w3c.dom.nodeold):用一个新的node对象代替给定的子节点对象。要提取message标签内的内容,通常会使用node对象的getnodevalue()方法:,元素类element,element对象所包含的主要的方法有:getelementsbytagname(string):返回一个nodelist对象,它包含了在这个标签中其下的子孙节点中具有给定标签名字的标签。gettagname():返回一个代表这个标签名字的字符串。getattribute(string):返回标签中给定属性名称的属性的值。在这儿需要主要的是,应为xml文档中允许有实体属性出现,而这个方法对这些实体属性并不适用。这时候需要用到getattributenodes()方法来得到一个attr对象来进行进一步的操作。getattributenode(string):返回一个代表给定属性名称的attr对象。,属性类attr,attr对象代表了某个标签中的属性。attr继承于node,但是因为attr实际上是包含在element中的,它并不能被看作是element的子对象,因而在dom中attr并不是dom树的一部分attr其实是被看作包含它的element对象的一部分,它并不作为dom树中单独的一个节点出现。这一点在使用的时候要同其它的node子对象相区别。,9.2使用sax解析xml,sax是事件驱动的,sax解析的方式非常类似流媒体的分析处理方式,这种解析模式能够随着文档的读入过程立即开始解析,而不需要等待文档中所有的数据被读入结束后再开始解析。适合于内存较小的应用场合。除此之外,应用程序甚至不必解析整个文档,它可以在某个条件得到满足时停止解析后面的文档。sax解析xml文档的基本原理为:首先获得一个实现sax接口的解析器,然后编写一个符合sax标准的处理器类,并且把这个类注册到刚生成的解析器,然后开始解析xml文件,解析器会把xml文档作为一个流读出来,并将文件流转换成一个事件流,最后根据事件调用定义在解析器里的事件处理方法对流中的事件做出响应。,sax的事件驱动模型,javasax的api,saxparserfactory:一个根据系统属性生成parser实例的解析器工厂类。其功能与dom中的documentbuilderfactory类相同。saxparser:一个定义了不同种类的parser()方法的接口。saxparser是一个与sax事件通讯的处理器,可以使用自定义的handler来处理事件。saxreader:saxparser中包含了一个saxreader,当要使用saxreader的getxmlreader()方法的时候就需要配置它。defaulthandler:类defaulthandler实现了contenthandler、errorhandler、dtdhandler和entityresolver接口,通过继承这个类,我们可以实现解析xml文档的所有任务。contenthandler:当遇到xml文档中的标签时,就将会调用这个接口中的startdocument、enddocument、startelement和endelement方法。当遇到xml文档中的元素内容时,将调用characters方法。errorhandler:当遇到不同类型的错误的时候分别调用相应的错误方法,这些方法包括:error、fatalerror和warning等。dtdhandler:该接口所定义的方法只用在处理dtd信息的时候。entityresolver:该接口中的resolveentity方法只在遇到uri标识数据的时候才调用。,9.3使用jdom解析xml,jdom是一个开源项目,它基于树型结构,利用纯java的技术对xml文档实现解析、生成、序列化以及多种操作。jdom直接为java编程服务。它利用更为强有力的java语言的诸多特性(方法重载、集合概念以及映射),把sax和dom的功能有效地结合起来。jdom中的类主要包括saxbuilder、dombuilder、document、xmloutputter、element和attribute等,jdom的api2-1,saxbuilder类jdom中的saxbuilder类会使用sax来建立一个jdom的解析树。它可以通过build()方法由指定的输入数据流建立一个文件,返回一个document对象。dombuilder类jdom中的dombuilder类会使用dom来建立一个jdom的解析树。它可以通过build()方法由指定的输入数据流建立一个文件,返回一个document对象。document类document类的一个实例用来描述一个xml文档。这个文档类是轻量级的,它可以包括文档类型、处理指令对象、根元素和注释对象等内容。,jdom的api2-2,xmloutputter类将xml文档写入一个特定的outputstream流中。其中output()方法用于将xml文档输出到指定的位置,既可以是标准的输出system.out,也可以是file对象或者outputstream对象。element类在jdom中,xml元素就是element类的实例。element类有两种主要的操作,一个是浏览元素树,另一个是移动元素。attribute类可以使用element类的getattribute()方法来取得一个元素的属性,该方法会返回一个attribute对象。attribute类提供了getvalue()方法,它将会以字符串的形式返回一个属性值。例如通过下面代码可以得到name元素的属性值:,9.4本章小结,本章主要介绍了javaxml程序设计的基础知识,详细讲解了dom编程、sax编程和jdom编程的基本流程和常用方法,第10章.net中的xml编程,10.1使用流模式处理xml,使用.net框架的system.xml名称空间中包含的xmltextreader类从xml文件中快速读取数据。通过xmltextreader类中的属性nodetype,可以知道其节点的节点类型。xmlnodereader可提供对xmlnode中的xml数据的快速、非缓存和只进的访问。它能够读取整个xmldom树,或只从子树读取。使用xmltextwriter类创建xml文件,10.2使用dom处理xml,.netframework中dom类的继承结构,使用dom加载及保存xml数据,首先,初始化xmldocument对象,例如:xmldocumentdoc=newxmldocument();然后,调用load()方法加载文件、流、xmlreader对象或textreader对象中的xml数据,例如:doc.load(c:bookdata.xml);或者调用loadxml()方法加载字符串中的xml数据,例如:doc.loadxml(+prideandprejudice+);使用xmldocument对象中的save方法可以将xml数据保存到一个xml文件中或是一个流对象、一个textwriter对象、一个xmlwriter对象中。save()方法的语法如下:xmldocument.save(filename|stream|textwriter|xmlwriter),使用dom浏览xml,创建并使用一个xmlnode对象在xmldocument对象中浏览、创建或修改节点。通过使用xmlnode对象及其派生类的属性,就可以返回有关xml源文档内容的信息。要想引用xmldocument对象中的单个节点,可以使用调用selectsinglenode()函数的方法或使用xmlnode类的浏览属性。可以创建xmlelement对象来解析xmldocument对象中的元素和属性的信息。xmlnodelist类表示xmlnode的有序集合可以使用xmlnamednodemap对象保存一个元素节点的属性集合,创建新节点,步骤:1、从xml数据源创建和加载xmldocument对象2、在原始文档中定位新节点的插入位置3、创建新节点,此节点可以使任何类型的节点。4、把新节点添加到xmldocument对象中,添加节点时调用的方法,xmlnode.appendchild添加到当前节点的子节点列表的末尾xmlnode.insertbefore添加到紧接着插入指定的引用节点之前xmlnode.insertafter添加到紧接着插入指定的引用节点之后,修改和删除节点,首先定位要操作的节点通过设置xmlelement对象的innertext属性或通过调用xmlnode.replacechild()方法替换整个节点的方式来修改节点值也可以通过调用xmlelement.setattribute()方法来修改属性节点。要删除xmldocument对象中的节点,可以通过调用xmlnode.removechild()方法来进行实现元素的移除,如果要删除属性的话,我们可以通过调用xmlelement.removeattribute()方法来实现属性节点的移除也可以通过调用xmlnode.removeall()方法移除所有的子节点,,10.3ado.net与xml,ado.net是microsoftactivexdataobject(ado,activex数据对象)的改进。它是一个基于标准的程序设计模型,用于创建分布式的、数据共享的应用程序。ado.net是一系列与数据操作相关的类。它们提供:比ado更灵活的数据访问机制;为非连接环境设计的系统架构;支持xml的编程对象模型;一系列用来在.net架构中访问数据的类、结构以及枚举器。dataset是分离存储和使用关系型数据的基础,它是一个容器,可以包含一个或多个数据表;而xml是dataset中数据的标准格式。,xml与dataset的关系,将xml数据加载到dataset对象中,使用readxml从一个文件或者一个流加载数据到数据集简化语法dataset对象.readxml(stream|filename|textreader|xmlreader,xmlreadmodemode),将xml数据加载到dataset对象中(续),xmlreadmode定义读取的内容readschema如果数据集中已经存在一个结构,那么在内嵌结构定义中的任何新表都会被添加到数据集如果内嵌结构定义中的表在数据集中已经存在,会抛出异常如果数据集不包含结构定义并且没有内嵌结构定义,则不加载任何数据ignoreschema忽略内嵌结构定义将复合数据集结构的数据加载inferschema忽略内嵌结构定义,根据xml文件推断一个新的结构,如果数据集中已经存在结构定义,将新结构追加到数据集,然后加载数据,将xml数据加载到dataset对象中(续),diffgram读diffgram并将当前结构定义的数据添加到数据集fragment读取xml片断并将数据追加到适当的数据集表,主要用于读取直接从sqlserver产生的xml数据auto如果数据集包含一个结构定义或者xml文件包含一个内嵌的结构定义,使用readschema选项如果数据集与xml文档都不包含一个结构定义,使用inferschema选项考虑到性能问题,不要使用auto选项,将dataset信息写入文件或流,使用writexml方法将数据集的数据写入到文件或流使用writexml()方

温馨提示

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

评论

0/150

提交评论