版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章基于DOM的解析器
XML解析器XML解析器是XML和应用程序之间的一个软件组织,为应用程序从XML文件解析出所需要的数据.
有两种类型的解析器:
基于DOM的解析器基于事件的解析器(SAX)6.1DOM解析器定义:DOM(DocumentObjectModel,文档对象模型)是W3C制定的一套规范标准.即规定了解析文件的接口.语言绑定:在特定语言中使用DOM规范就需要定义DOM规范指定的接口,并给出实现这些接口的类的集合.(本书主要讲述DOM规范的Java语言绑定)DOM规范的核心:DOM规范指定了语言绑定需要实现的接口,简单的说,各种基于DOM规范的解析器必须按照DOM规范在内存中建立数据.DOM规范的核心是树模型.接口(interface)是描述类的部分行为的一组操作,它也是一个类提供给另一个类的一组操作。接口只是一组操作,没有属性。我们介绍的是Sun公司的DOM解析器,支持DOMlevel3的解析器.(JAXP(JavaAPIforXMLParsing)实现了DOM规范的Java语言绑定)6.1DOM解析器6.1DOM解析器DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();6.1DOM解析器对象Document是由实现了Node接口的类的实例构成的,这些实例称作Document对象中的节点。Document对象中的节点形成树状结构,也就是说XML文件的标记、标记的文本内容、实体等都会和对象Document中的某个节点相对应。应用程序主要分析内存中的树状结构数据Document,就可以获得XML文件中的各种数据。DOM解析器经常使用下述3个方法解析文件:publicDocumentparse(Filef)throwsSAXException,IOException例如:Filef=newFile(“price.xml”);Documentdocument=builder.parse(f);6.1DOM解析器2.publicDocumentparse(InputStreamin)throwsSAXException,IOException例如:FileInputStreamin=newFileInputStream(“price.xml”);Documentdocument=builder.parse(in);6.1DOM解析器6.1DOM解析器3.publicDocumentparse(Stringuri)throwsSAXException,IOException例如:Stringuri=“/price.xml”;Documentdocument=builder.parse(uri);1.Node接口
parse方法将整个被解析的XML文件封装成一个节点返回(XML文件和内存中的Document节点相对应),故应用程序可以从Document节点的子子孙节点中获取整个XML文件中数据的细节.Node接口有如下的子接口:Attr,SDATASection,CharacterData,Comment,DocumentFragment,DocumentType,Element,Entity,EntityReference,Notation,ProcessingInstruction,Text6.2节点的类型Node接口常用方法:shortgetNodeType():返回一个表示节点类型的常量.NodeListgetChildNodes():返回一个有当前节点的所有子节点组成的NodeList对象.NodegetFirstChild():返回当前节点的第一个子节点.NodegetLastChild():返回当前节点的最后一个子节点.NodeListgetTextContent():返回当前节点及所有子孙节点中的文本内容.6.2节点的类型DocumentDocumentTypeElementElementCDATASectionText6.2节点的类型3.节点的子孙关系6.3Document节点Document节点经常使用下列方法获取和该节点的相关方法:(1)ElementgetDocumentElement()(2)DocumentTypegetDoctype()(3)NodeListgetElementByTagName(Stringname)(4)NodeListgetElementsByTagNameNS(StringnamespaceURI,StringlocalName)(5)StringgetXmlEncoding()(6)booleangetXmlStandalone()(8)StringgetXmlVersion()Cha6_1.xml(P138)<?xmlversion="1.0"encoding="UTF-8"?><雇员列表><雇员>sdfs<姓名>张三</姓名><年龄>25岁</年龄><工资>3190元/月</工资></雇员><雇员><姓名>李四</姓名><年龄>35岁</年龄><工资>4320元/月</工资></雇员><雇员><姓名>王五</姓名><年龄>45岁</年龄><工资>5610元/月</工资></雇员></雇员列表>JAXPOne.javaimportorg.w3c.dom.*;importjavax.xml.parsers.*;importjava.io.*;publicclassJAXPOne{publicstaticvoidmain(Stringargs[]){try{DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();DocumentBuilderbuilder=factory.newDocumentBuilder();Documentdocument=builder.parse(newFile("Cha6_1.xml"));Stringversion=document.getXmlVersion();System.out.println("XML声明的版本号:"+version);Stringencoding=document.getXmlEncoding();System.out.println("XML声明的的编码:"+encoding);Elementroot=document.getDocumentElement();StringrootName=root.getNodeName();System.out.println("XML文件根节点的名字:"+rootName);
NodeListnodelist=document.getElementsByTagName("雇员");intsize=nodelist.getLength();
for(intk=0;k<size;k++){Nodenode=nodelist.item(k);Stringname=node.getNodeName();Stringcontent=node.getTextContent();System.out.print(name);System.out.println(":"+content);}}catch(Exceptione){System.out.println(e);}}}6.4Element节点Element节点经常使用的方法获取和该节点相关的信息(1)StringgetTagName()(2)StringgetAttribute(Stringname)(3)NodeListgetElementByTagName(Stringname)(4)NodeListgetElementByTagNameNS(StringnamespaceURI,StringlocalName)(5)booleanhasAttribute(Stringname)(6)booleanhasAttribute(StringnamspaceURI,StringlocalName)shortgetNodeType()用于返回节点的类型,如果返回值是Node.ELEMENT_NODE,那么该节点就是Element节点.Cha6_2.xml(P140)<?xmlversion="1.0"encoding="UTF-8"?><图书摘要><Java基础教程ISBN="7302091420">Java是一门很优秀的语言,具有平台无关等特点。
</Java基础教程><JSP基础教程ISBN="7302096066">JSP是Sun公司推出的动态网页技术标准.</JSP基础教程><XML基础教程ISBN="7802096565">XML是万维网联盟定义的一种语言
</XML基础教程></图书摘要>JAXPTwo.javaimportorg.w3c.dom.*;importjavax.xml.parsers.*;importjava.io.*;publicclassJAXPTwo{publicstaticvoidmain(Stringargs[]){try{DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();DocumentBuilderbuilder=factory.newDocumentBuilder();Documentdocument=builder.parse(newFile("Cha6_2.xml"));Elementroot=document.getDocumentElement();StringrootName=root.getNodeName();System.out.println("XML文件根节点的名字:"+rootName);
NodeListnodeList=root.getChildNodes();intsize=nodeList.getLength();for(intk=0;k<size;k++){Nodenode=nodeList.item(k);if(node.getNodeType()==Node.ELEMENT_NODE){ElementelementNode=(Element)node;Stringname=elementNode.getNodeName();Stringid=elementNode.getAttribute("ISBN");Stringcontent=elementNode.getTextContent();System.out.print(name);System.out.print(id);System.out.println(":"+content);}}}catch(Exceptione){System.out.println(e);}}}6.5Text节点
规范的XML文件的非空标记可以有子标记和文本内容.在DOM规范中,解析器使用Element节点封装标记,用Text节点封装标记的文本内容,即Element节点可以有Element子节点和Text节点。例如:<姓名>张小三<性别>男</性别><年龄>23</年龄></姓名>StringgetWholeText():获取节点中的文本(包括其中的空白字符)shortgetNodeType()用于返回节点的类型,如果返回值是Node.TEXT_NODE,那么该节点就是Text节点.Cha6_3.xml<?xmlversion="1.0"encoding="UTF-8"?><商品信息><名称>电视机
<生产日期>2005年</生产日期><库存量>120台</库存量><单价>2390元</单价></名称><名称>洗衣机
<生产日期>2005年</生产日期><库存量>234台</库存量><单价>1234元</单价></名称></商品信息>JAXPThree.javaimportorg.w3c.dom.*;importjavax.xml.parsers.*;importjava.io.*;publicclassJAXPThree{publicstaticvoidmain(Stringargs[]){
OutContentoutContent=newOutContent();try{
DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();DocumentBuilderbuilder=factory.newDocumentBuilder();Documentdocument=builder.parse(newFile("Cha6_3.xml"));Elementroot=document.getDocumentElement();StringrootName=root.getNodeName();System.out.println("XML文件根节点的名字:"+rootName);
NodeListnodeList=root.getChildNodes();outContent.output(nodeList);
System.out.println("一共有"+outContent.m+"个Text节点");}catch(Exceptione){System.out.println(e);}}}classOutContent{intm=0;publicvoidoutput(NodeListnodeList){intsize=nodeList.getLength();for(intk=0;k<size;k++){Nodenode=nodeList.item(k);if(node.getNodeType()==Node.TEXT_NODE){TexttextNode=(Text)node;Stringcontent=textNode.getWholeText();m++;System.out.print(content);}if(node.getNodeType()==Node.ELEMENT_NODE){ElementelementNode=(Element)node;Stringname=elementNode.getNodeName();System.out.print(name);NodeListnodes=elementNode.getChildNodes();output(nodes);}}}}6.6CDATASection节点
用于封装CDATA段,CDATASection节点可以是Element的节点的子节点.StringgetWholeText():获取节点中的文本,即CDATA段中的文本(包括其中的空白字符)shortgetNodeType()用于返回节点的类型,如果返回值是Node.CDATA_SECTION_NODE,那么该节点就是CDATASection节点.计算节点数目的方法,例如:<hi>北京<![CDATA[booleanboo=true&&false<你好>]]>上海<![CDATA[<大家好>]]></hi>6.6CDATASection节点6.7Attr节点让Element节点调用调用NamedNodeMapgetAttributes()方法返回的NameNodeMap对象由节点组成,这些节点可以被转换为Atrr节点.StringgetName():返回属性的名字StringgetValue():返回属性的值6.8DocumentType节点DocumentType节点对应着XML文件所关联DTD文件.通过进一步获取该节点子孙节点来分析DTD文件中的数据.Document调用getDoctype()返回当前节点的DocmentType子节点StringgetName()StringgetPublicld()StringgetSystemld()StringgetInternalSubset()例如:<!DOCTYPE房子PUBLIC“-//ISO88//beijing//ForXML/Ch”“b1.dtd”获取实体解析器将实体封装为Entity节点,DocumentType节点调用NamedNodeMapgetEntities()这个方法返回了一个NamedNodeMap对象,NamedNodeMap对象被转换为Entity的节点。获取实体方法:getTextContent()方法回返实体getInputEncoding()方法可以返回解析实体所用编码或null6.8DocumentType节点6.9处理空白
如果让DOM解析器忽略缩进空白,即这些缩进空白不在Document中形成Text节点,那么满足:XML文件必须有效所关联的DTD文件必须规定XML文件的标记不能有混合内容DocumentBuilderFactory对象设置setIgnoringElementContentWhitespace(true)6.10验证规范性和有效性如果想要检查一个XML文件是否有效,必须让DocumentBuilderFactory对象factory事先设置是否检查XML文件的有效性,如:factory.setValidating(ture)6.11使用DOM生成XML文件1.Transformer对象解析器parse方法将整个被解析的XML文件封装成一个Document节点返回,我们可以对Document节点进行修改,然后使用Transformer对象将一个Document节点变成为一个XML文件.变换步骤:解析器通过调用newDocument()可得到一个Document节点,应用程序修改这样的Document节点,然后使用Transformer对象对一个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年网络安全与数据安全产业机遇知识题库
- 2026年电力交易结算流程与不平衡资金分摊解析
- 2026年心理学基础理论及实操知识
- 2026年中国象棋等级考试纲要与模拟题集解析
- 2026年现代物流技术与管理要点解析单选题集
- 2026年文化馆音乐辅导基本知识试题集
- 2026年中石化新材料表征与测试技术考核练习题
- 2026年街道办事处公务员面试模拟题
- 2026年成功面试技巧面试问题与回答指南
- 2026年中药材质量安全及追溯体系建设要求试题
- 变压器过户申请书模板
- 《运动生理学实验》课件
- 《新媒体营销》课件-项目二 走进新媒体营销
- (正式版)SHT 3075-2024 石油化工钢制压力容器材料选用规范
- 第一单元项目一探秘鸟类研究认识数据信息与知识课件沪科版高中信息技术必修1
- T CACM、T CAAM 冬病夏治穴位贴敷疗法治未病干预指南
- 关于请求支援xxx的函-公文关于协助函
- 第七讲-80年代文学思潮
- 超级电容器制造技术
- 基于无人机技术的土石方测量
- 盒马鲜生仓储数据分析报告
评论
0/150
提交评论