ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:21.61KB ,
资源ID:19339004      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/19339004.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(DOM解析.docx)为本站会员(b****1)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

DOM解析.docx

1、DOM解析转DOM解析之Document,Node,NodeList,NamedNodeMap2013-1-10阅读644评论0Element是Node的子集,XmlNode表示一个节点,包括XmlElement(元素)和XmlAttribute(属性)等。 如:/node/nodeStringValue/node/node/node 以上Alarm(元素节点),lock(属性节点),Time(元素节点),StringValue(文本节点)都是Node,但是只有 .和StringValue是Element-以下是我自己的理解-xml element是继承于node,除了element之外,还有

2、XmlAttribute、XmlText等。通过某些方法可能可以得到某个值,可能是element、attribute、xmlText等,如果你不确定,则可以使用node来做返回值的类型。node只是具有了一些通用的方法,而element则具有更具体的功能。 在DOM接口规范中,有四个基本的接口:Document,Node,NodeList以及NamedNodeMap。在这四个基本接口中,Document接口是对文档进行操作的入口,它是从Node接口继承过来的。Node接口是其他大多数接口的父类,象Document,Element,Attribute,Text,Comment等接口都是从Node

3、接口继承过来的。NodeList接口是一个节点的集合,它包含了某个节点中的所有子节点。NamedNodeMap接口也是一个节点的集合,通过该接口,可以建立节点名和节点之间的一一映射关系,从而利用节点名可以直接访问特定的节点。1.DocumentDocument接口代表了整个XML/HTML文档,因此,它是整棵文档树的根,提供了对文档中的数据进行访问和操作的入口。2.NodeListNodeList接口提供了对节点集合的抽象定义,它并不包含如何实现这个节点集的定义。NodeList用于表示有顺序关系的一组节点,比如某个节点的子节点序列。另外,它还出现在一些方法的返回值中,例如getElement

4、sByTagName。在DOM中,NodeList的对象是live的,换句话说,对文档的改变,会直接反映到相关的NodeList对象中。例如,如果通过DOM获得一个NodeList对象,该对象中包含了某个Element节点的所有子节点的集合,那么,当再通过DOM对Element节点进行操作(添加、删除、改动节点中的子节点)时,这些改变将会自动地反映到NodeList对象中,而不需DOM应用程序再做其他额外的操作。NodeList中的每个item都可以通过一个索引来访问,该索引值从0开始。3.NamedNodeMap实现了NamedNodeMap接口的对象中包含了可以通过名字来访问的一组节点的集

5、合。不过注意,NamedNodeMap并不是从NodeList继承过来的,它所包含的节点集中的节点是无序的。尽管这些节点也可以通过索引来进行访问,但这只是提供了枚举NamedNodeMap中所包含节点的一种简单方法,并不表明在DOM规范中为NamedNodeMap中的节点规定了一种排列顺序。NamedNodeMap表示的是一组节点和其唯一名字的一一对应关系,这个接口主要用在属性节点的表示上。与NodeList相同,在DOM中,NamedNodeMap对象也是live的。4.Dom对象一切都是节点(对象).Node对象:DOM结构中最为基本的对象Document对象:代表整个XML的文档Node

6、List对象:包含一个或者多个Node的列表Element对象:代表XML文档中的标签元素5.dom解析xml步骤javaview plaincopyprint?1. importjavax.xml.parsers.*;2. 3. importorg.w3c.dom.*;4. 5. publicclassdom6. 7. publicstaticvoidmain(Stringargs)8. 9. try10. 11. /建立解析器工厂12. 13. DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();14. 15

7、. /获得解析器16. 17. DocumentBuilderbuilder=factory.newDocumentBuilder();18. 19. Documentdoc=builder.parse(candidate.xml);20. 21. NodeListnl=doc.getElementsByTagName(PERSON);22. 23. for(inti=0;inl.getLength();i+)24. 25. Elementnode=(Element)nl.item(i);26. 27. System.out.print(NAME:);28. 29. System.out.pr

8、intln(node.getElementsByTagName(NAME).item(0).getFirstChild().getNodeValue();30. 31. 32. 33. System.out.println();34. 35. 36. 37. catch(Exceptione)e.printStackTrace();38. 39. 40. 41. 程序详解:1)DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();我们在这里使用DocumentBuilderFacotry的目的是为了创建与具体解析器无关的程

9、序,当DocumentBuilderFactory类的静态方法newInstance()被调用时,它根据一个系统变量来决定具体使用哪一个解析器。又因为所有的解析器都服从于JAXP所定义的接口,所以无论具体使用哪一个解析器,代码都是一样的。所以当在不同的解析器之间进行切换时,只需要更改系统变量的值,而不用更改任何代码。这就是工厂所带来的好处。2)DocumentBuilderdb=dbf.newDocumentBuilder();当获得一个工厂对象后,使用它的静态方法newDocumentBuilder()方法可以获得一个DocumentBuilder对象,这个对象代表了具体的DOM解析器。但具

10、体是哪一种解析器,微软的或者IBM的,对于程序而言并不重要3)然后,我们就可以利用这个解析器来对XML文档进行解析了Documentdoc=db.parse(c:/xml/message.xml);DocumentBuilder的parse()方法接受一个XML文档名作为输入参数,返回一个Document对象,这个Document对象就代表了一个XML文档的树模型。以后所有的对XML文档的操作,都与解析器无关,直接在这个Document对象上进行操作就可以了。而具体对Document操作的方法,就是由DOM所定义的了4).从上面得到的Document对象开始,我们就可以开始我们的DOM解析了。

11、使用Document对象的getElementsByTagName()方法,我们可以得到一个NodeList对象,一个Node对象代表了一个XML文档中的一个标签元素,而NodeList对象,所代表的是一个Node对象的列表NodeListnl=doc.getElementsByTagName(message);我们通过这样一条语句所得到的是XML文档中所有标签对应的Node对象的一个列表。然后,我们可以使用NodeList对象的item()方法来得到列表中的每一个Node对象Nodemy_node=nl.item(0);5).当一个Node对象被建立之后,保存在XML文档中的数据就被提取出来

12、并封装在这个Node中了。在这个例子中,要提取Message标签内的内容,我们通常会使用Node对象的getNodeValue()方法Stringmessage=my_node.getFirstChild().getNodeValue();注意:请注意,这里还使用了一个getFirstChild()方法来获得message下面的第一个子Node对象。虽然在message标签下面除了文本外并没有其它子标签或者属性,但是我们坚持在这里使用getFirstChild()方法,这主要和W3C对DOM的定义有关。W3C把标签内的文本部分也定义成一个Node,所以先要得到代表文本的那个Node,我们才能够

13、使用getNodeValue()来获取文本的内容6.dom基本对象详解DOM的基本对象有5个:Document,Node,NodeList,Element和AttrDocument对象代表了整个XML的文档,所有其它的Node,都以一定的顺序包含在Document对象之内,排列成一个树形的结构,程序员可以通过遍历这颗树来得到XML文档的所有的内容,这也是对XML文档操作的起点。我们总是先通过解析XML源文件而得到一个Document对象,然后再来执行后续的操作。此外,Document还包含了创建其它节点的方法,比如createAttribute()用来创建一个Attr对象。它所包含的主要的方法

14、有1).createAttribute(String):用给定的属性名创建一个Attr对象,并可在其后使用setAttributeNode方法来放置在某一个Element对象上面。2)createElement(String):用给定的标签名创建一个Element对象,代表XML文档中的一个标签,然后就可以在这个Element对象上添加属性或进行其它的操作。3)createTextNode(String):用给定的字符串创建一个Text对象,Text对象代表了标签或者属性中所包含的纯文本字符串。如果在一个标签内没有其它的标签,那么标签内的文本所代表的Text对象是这个Element对象的唯一子

15、对象。4)getElementsByTagName(String):返回一个NodeList对象,它包含了所有给定标签名字的标签。5)getDocumentElement():返回一个代表这个DOM树的根元素节点的Element对象,也就是代表XML文档根元素的那个对象。7.Node对象所包含的主要的方法有appendChild(org.w3c.dom.Node):为这个节点添加一个子节点,并放在所有子节点的最后,如果这个子节点已经存在,则先把它删掉再添加进去。getFirstChild():如果节点存在子节点,则返回第一个子节点,对等的,还有getLastChild()方法返回最后一个子节点

16、。getNextSibling():返回在DOM树中这个节点的下一个兄弟节点,对等的,还有getPreviousSibling()方法返回其前一个兄弟节点。getNodeName():根据节点的类型返回节点的名称。getNodeType():返回节点的类型.getNodeValue():返回节点的值。hasChildNodes():判断是不是存在有子节点。hasAttributes():判断这个节点是否存在有属性。getOwnerDocument():返回节点所处的Document对象。insertBefore(org.w3c.dom.Nodenew,org.w3c.dom.Noderef):

17、在给定的一个子对象前再插入一个子对象。removeChild(org.w3c.dom.Node):删除给定的子节点对象.replaceChild(org.w3c.dom.Nodenew,org.w3c.dom.Nodeold):用一个新的Node对象代替给定的子节点对象。NodeList对象,顾名思义,就是代表了一个包含了一个或者多个Node的列表。可以简单的把它看成一个Node的数组,我们可以通过方法来获得列表中的元素:getLength():返回列表的长度。item(int):返回指定位置的Node对象8Element对象代表的是XML文档中的标签元素,继承于Node,亦是Node的最主要

18、的子对象。在标签中可以包含有属性,因而Element对象中有存取其属性的方法,而任何Node中定义的方法,也可以用在Element对象上面。getElementsByTagName(String):返回一个NodeList对象,它包含了在这个标签中其下的子孙节点中具有给定标签名字的标签。getTagName():返回一个代表这个标签名字的字符串。getAttribute(String):返回标签中给定属性名称的属性的值。在这儿需要注意的是,因为XML文档中允许有实体属性出现,而这个方法对这些实体属性并不适用。这时候需要用到getAttributeNode()方法来得到一个Attr对象来进行进一

19、步的操作getAttributeNode(String):返回一个代表给定属性名称的Attr对象。9.Attr对象代表了某个标签中的属性。Attr继承于Node,但是因为Attr实际上是包含在Element中的,它并不能被看作是Element的子对象,因而在DOM中Attr并不是DOM树的一部分,所以Node中的getparentNode(),getpreviousSibling()和getnextSibling()返回的都将是null。也就是说,Attr其实是被看作包含它的Element对象的一部分,它并不作为DOM树中单独的一个节点出现。这一点在使用的时候要同其它的Node子对象相区别SA

20、X解析 SAX的全称是SimpleAPIsforXML,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。由于SAX分析器实现简单,对内存要求比较低,因此实现效率比较高,对于那些只需要访问XML文档中的数据而不对文档进行更改的应用程序来说,SAX分析器更为合适。 SAX(SimpleAPIsforXML),面向XML的简单APIs。使用DOM解析XML时,首先将XML文档加载到内存当中,然后可以通过随机

21、的方式访问内存中的DOM树;SAX是基于事件而且是顺序执行的,一旦经过了某个元素,我们就没有办法再去访问它了,SAX不必事先将整个XML文档加载到内存当中,因此它占据内存要比DOM小,对于大型的XML文档来说,通常会使用SAX而不是DOM进行解析。SAX也是使用的观察者模式(类似于GUI中的事件)图中最上方的SAXParserFactory用来生成一个分析器实例。XML文档是从左侧箭头所示处读入,当分析器对文档进行分析时,就会触发在DocumentHandler,ErrorHandler,DTDHandler以及EntityResolver接口中定义的回调方法。4.SAX是事件驱动的,文档的读

22、入过程就是SAX的解析过程。在读入的过程中,遇到不同的项目,解析器会调用不同的处理方法。5.org.xml.sax.helpers.DefaultHandler类的方法项目处理方法文档开始startDocument()startElement()“TonyBlair”characters()endElement()文档结束endDocument()6.SAX方式提取XML文档内容信息示例javaview plaincopyprint?1. packagecom.shengsiyuan.xml.sax;2. 3. importjava.io.File;4. 5. importjava.util.

23、Stack;6. 7. importjavax.xml.parsers.SAXParser;8. 9. importjavax.xml.parsers.SAXParserFactory;10. 11. importorg.xml.sax.Attributes;12. 13. importorg.xml.sax.SAXException;14. 15. importorg.xml.sax.helpers.DefaultHandler;16. 17. publicclassSaxTest218. 19. 20. 21. publicstaticvoidmain(Stringargs)throwsE

24、xception22. 23. 24. 25. /step1:获得SAX解析器工厂实例26. 27. SAXParserFactoryfactory=SAXParserFactory.newInstance();28. 29. /step2:获得SAX解析器实例30. 31. SAXParserparser=factory.newSAXParser();32. 33. /step3:开始进行解析34. 35. parser.parse(newFile(student.xml),newMyHandler2();36. 37. 38. 39. 40. 41. classMyHandler2exte

25、ndsDefaultHandler42. 43. 44. 45. privateStackstack=newStack();46. 47. privateStringname;48. 49. privateStringgender;50. 51. privateStringage;52. 53. Override54. 55. publicvoidstartElement(Stringuri,StringlocalName,StringqName,56. 57. Attributesattributes)throwsSAXException58. 59. 60. 61. stack.push(

26、qName);62. 63. for(inti=0;iattributes.getLength();i+)64. 65. 66. 67. StringattrName=attributes.getQName(i);68. 69. StringattrValue=attributes.getValue(i);70. 71. System.out.println(attrName+=+attrValue);72. 73. 74. 75. 76. 77. Override78. 79. publicvoidcharacters(charch,intstart,intlength)80. 81. th

27、rowsSAXException82. 83. 84. 85. Stringtag=stack.peek();86. 87. if(姓名.equals(tag)88. 89. 90. 91. name=newString(ch,start,length);92. 93. 94. 95. elseif(性别.equals(tag)96. 97. 98. 99. gender=newString(ch,start,length);100. 101. 102. 103. elseif(年龄.equals(tag)104. 105. 106. 107. age=newString(ch,start,length);108. 109. 110. 111. 112. 113. Override114. 115. publicvoidendElement(Stringuri,StringlocalName,StringqName)116. 117. throwsSAXException118. 119. 120. 121. stack.pop();/表示该元素已经解析完毕,需要从栈中弹出122.

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1