《XML程序设计第6章》由会员分享,可在线阅读,更多相关《XML程序设计第6章(25页珍藏版)》请在金锄头文库上搜索。
1、XML程序设计程序设计第第6章章配合例子源代码一起使用例子源代码一起使用DOM解析器 2009-10-201本章主要内容本章主要内容初识初识DOM解析器解析器节点类型节点类型Document节点节点Element节点节点Text节点节点CDATASection节点节点Attr节点节点DocumentType节点节点处理空白处理空白使用使用DOM生成生成XML文件文件难点难点使用使用DOM生成生成XML文件文件第6章章 导读导读2009-10-202概述概述 XML解解析析器器是是XML和和应应用用程程序序之之间间的的一一个个软软件件组组织织,为为应应用用程程序序从从XML文文件件中中解解析析出
2、出所需要的数据。所需要的数据。 有有两两种种类类型型的的解解析析器器:基基于于DOM的的解解析析器器和和基基于于事事件件的的解解析析器器,本本章章讲讲述述基基于于DOM的的解解析析器器,下下一一章章讲讲述述基基于于事事件件的的解解析析器器(SAX)。)。2009-10-2036.1DOM解析器解析器 DOMDOM解解析析器器的的核核心心是是在在内内存存中中建建立立和和XMLXML文文件件相相对对应应的的树树形形结结构构数数据据,XMLXML文文件件的的标标记记、标标记记的的文文本本内内容容等等都都会会和和内内存存中中树树形结构数据的某个节点相对应。形结构数据的某个节点相对应。 2009-10-
3、2046.1.1DOM标准标准 DOMDOM(Document Document Object Object ModelModel,文文档档对对象象模模型型)是是W3CW3C制制定定的的一一套套规规范范标标准准,各各种种语语言言可可以以按按着着DOMDOM规规范范给给出出解解析析XMLXML文文件件的的解解析析器器。DOMDOM规规范范中中所所指指的的文文件件相相当当的的广广泛泛,其其中中包括包括XMLXML文件以及文件以及HTMLHTML文件。文件。 JavaJava语语言言通通过过把把DOMDOM规规范范中中的的接接口口用用JavaJava的的接接口口(interfaceinterface
4、)写写下下来来,并并给给出出实实现现这这些些接接口口的的类类的的集集合合,从从而而实实现现DOMDOM规规范范的的JavaJava语语言言绑绑定定(Java Java language language bindingbinding)。)。 2009-10-2056.1.2初识初识JAXP_1 按按着着W3CW3C制制定定的的DOMDOM规规范范,SunSun公公司司发发布布的的JDK1.4JDK1.4的的后后续续版版本本中中提提供供了了解解析析XMLXML文文件件的的APIAPI(Java Java API API for for XML XML ParsingParsing,JAXPJAX
5、P),JAXPJAXP实实现现了了DOMDOM规规范范的的JavaJava语语言言绑绑定定,给给出出了了DOMDOM规规范范指指定定的的接接口口,并并给给出实现这些接口的类的集合。出实现这些接口的类的集合。 2009-10-2066.1.2初识初识JAXP_2 在在JAXP(JavaAPIforXMLParsing,JAXP)中中,DOM解解析析器器是是DocumentBuilder类类的的一一个个实实例例,该该实实例例由由DocumentBuilderFactory负负责责创创建。建。步骤有步骤有3 3步。步。 1 1.使使用用javax.xml.parsersjavax.xml.parse
6、rs包包中中的的DocumentBuilderFactoryDocumentBuilderFactory类类调调用用其其类方法类方法newInstance()newInstance()实例化一个实例化一个DocumentBuilderFactoryDocumentBuilderFactory对象对象 DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); 2. 2.步骤步骤1得到
7、的得到的DocumentBuilderFactory对象调用对象调用newDocumentBuilder()方方 法法 返返 回回 一一 个个 DocumentBuilderDocumentBuilder对对 象象(DocumentBuilderDocumentBuilder类类在在javax.xml.parsersjavax.xml.parsers包包中中) domParserdomParser(称称做做DOMDOM解析器),例如:解析器),例如: DocumentBuilder domParser=factory.newDocumentBuilder(); DocumentBuilder
8、domParser=factory.newDocumentBuilder();3.3.步步骤骤2中中得得到到的的DOM解解析析器器调调用用 public public Document Document parse(File parse(File f f) )方方法法解解析析参参数数f f指指定定的的XMLXML文文件件,该该方方法法返返回回的的对对象象是是实实现现了了DocumentDocument接接口口的的一一个个实实例例(DocumentDocument接接口口在在org.w3c.domorg.w3c.dom包包中中),例例如:如: Document document=domParse
9、r.parse(new File(student.xml) ; Document document=domParser.parse(new File(student.xml) ; 2009-10-2076.1.2初识初识JAXP_3 DOMDOM解解析析器器domParsedomParse调调用用parseparse方方法法返返回回的的对对象象documentdocument是是由由一一些些NodeNode对对象象所所构构成成,NodeNode对对象象被被习习惯惯地地称称作作节节点点,这这些些节节点点被被组组成成树树形形结结构构。DocumentDocument的的结结构构和和XMLXML标标
10、记记组组成成的的树树形形结结构构相相同同,即即documentdocument就就是是DOMDOM解解析析器器在在内内存存中中建建立立的的和和XMLXML文文件件相相对对应应的的树树形形结构数据。结构数据。 应应用用程程序序只只要要分分析析内内存存中中的的树树形形结结构构数数据据documentdocument,就可以获得就可以获得XMLXML文件中的各种数据了。文件中的各种数据了。 2009-10-2086.1.3Doucument对象的结构对象的结构 DOMDOM解解析析器器负负责责在在内内存存中中建建立立DocumentDocument对对象象,即即调调用用parseparse方方法法返
11、返回回一一个个实实现现DocumentDocument接接口口的的对对象象,简简称称DocumentDocument对对象象。也也称称DocumentDocument对对象象为为DocumentDocument节节点点。应应用用程程序序可可以以从从DocumentDocument节节点点的的子子孙孙节节点点中中获获取取整整个个XMLXML文件中数据的细节。文件中数据的细节。 DocumentDocument节节点点是是“树树”的的根根节节点点,该该“树树”由由实实现现了了NodeNode接接口口的的类类的的实实例例所所组组成成,XMLXML文文件件中中的的标标记记都都和和DocumentDoc
12、ument节点的某个节点的某个NodeNode子节点相对应。子节点相对应。 例题例题6.1p1352009-10-2096.1.3example6_1.xml文件对应的文件对应的Document节点节点2009-10-20106.2.1NodeNode接口接口 6.2节点的类型节点的类型 Doucumen接接口口也也是是Node接接口口的的子子接接口口,也也就就是是说说,parse方方法法将将整整个个被被解解析析的的XML文文件件封封装装成成一一个个节节点点返返回回(XML文文件件和和内内存存中中的的Document节节点点相相对对应应),并并且且该该节节点点和和它它的的子子节节点点组组成成树
13、树形形结结构构数数据据。因因此此,应应用用程程序序可可以以从从Document节节点点的的子子孙孙节节点点中中获获取取整整个个XML文件中数据的细节。文件中数据的细节。2009-10-20116.2.2Node Node 接口的常用方法接口的常用方法 shortgetNodeType() 该该方方法法返返回回一一个个表表示示节节点点类类型型的的常常量量(Node接接口口规规定定的的常常量量值值),例例如如,对对于于Element节节点点,getNodeType()方方法法返返回回的的值值为为 Node.ELEMENT_NODE NodeListgetChildNodes() 返回一个由当前节点
14、的所有子节点组成的返回一个由当前节点的所有子节点组成的NodeList对象。对象。NodegetFirstChild() 返回当前节点的第一个子节点。返回当前节点的第一个子节点。NodegetLastChild() 返回当前节点的最后一个子节点。返回当前节点的最后一个子节点。NodeListgetTextContent() 返回当前节点及所有子孙节点中的文本内容。返回当前节点及所有子孙节点中的文本内容。 2009-10-20126.2.3节点的子孙关系节点的子孙关系 为为了了解解析析规规范范的的XML文文件件,DOM规规范范规规定定了了各各种种类类型型节节点点之之间间可可以以形形成成的的子子
15、孙孙 关关 系系 , 比比 如如 ,Document节节点点有有且且仅仅有有一一个个Element节节点点,也也可可以以有有一一个个DocumentType节节点点(规规范范的的XML文文件件有有且且仅仅有有一一个个根根标标记记,也也可可以以有有一一个个与与其其关关联联的的DTD文文件件),Element节节点点可可以以有有Element子子节节点点和和Text子子节节点点(规规范范的的XML文文件件中中的的标标记记可可以以有有子子标标记记和和文本)文本)。2009-10-20136.2.4使用递归方法输出节点中的数据使用递归方法输出节点中的数据 节节点点调调用用getNodeType()方方
16、法法返返回回一一个个表表示示节节点点类类型型的的常常量量(Node接接口口规规定定的的常常量量值值),因因此此我我们们可可以以通通过过判判断断节节点点的的类类型型来来输输出出和和节节点点相相关关的的数数据据,比比如如当当节节点点类类型型的的ElementElement节节点点时时,就就输输出出节节点点的的名名字字,当当节节点点是是TextText节节点点时时就就输输出节点中的数据等。出节点中的数据等。例题例题6.2p138 2009-10-20146.3DocumentDocument节点节点 解解析析器器的的parse方方法法将将整整个个被被解解析析的的XML文文件件封封装装成成一一个个Do
17、cument节节点点返返回回,应应用用程程序序可可以以从从该该节节点点的子孙节点中获取整个的子孙节点中获取整个XML文件中数据的细节。文件中数据的细节。Document节节点点的的两两个个直直接接子子节节点点的的类类型型分分别别是是DocumentType类类 型型 和和 Element类类 型型 , 其其 中中 的的DocumentType节节点点对对应应着着XML文文件件所所关关联联的的DTD文文件件,通通过过进进一一步步获获取取该该节节点点子子孙孙节节点点来来分分析析DTDL文文件件中中的的数数据据;而而其其中中的的Element类类型型节节点点对对应应着着XML文文件件的的根根节节点点
18、,通通过过进进一一步步获获取取该该Element类类型型节节点点子孙节点来分析子孙节点来分析XML文件中的数据。文件中的数据。Document节点常用方法见节点常用方法见P139P139.2009-10-20156.4ElementElement节点节点 Element节节点点是是Document节节点点的的最最重重要要的的子子孙孙节节点点,因因为为被被解解析析的的XML文文件件的的标标记记对对应应着着这这样样类类型型的的节节点点。表表示示Element节节点的常量是点的常量是Node.ELEMENT_NODE,一一个个节节点点用用shortgetNodeType()方方法法返返 回回 的的
19、值值 如如 果果 等等于于Node.ELEMENT_NODE,那那么么该该节节点就是点就是Element节点节点。Element Element 节点常用方法见节点常用方法见P140 .P140 .例例题题6.3p141(解析器获得的Document节点及其子孙节点的示意图如图6.6 )2009-10-20166.5TextText节点节点 规规范范的的XML文文件件的的非非空空标标记记可可以以有有子子标标记记和和文文本本内内容容。在在DOM规规范范中中,解解析析器器使使用用Element节节点点封封装装标标记记,用用Text节节点点封封装装标标记记的的文文本本内内容容,即即Element节节
20、点点可可以以有有Element子节点和子节点和Text节点。节点。表表示示Text节节点点的的常常量量是是Node.TEXT_NODENode.TEXT_NODE,一一个个节节点点调调用用short short getNodeType()getNodeType()方方法法返返回回的的值值如如果果等等于于Node.TEXT_NODENode.TEXT_NODE,那那么该节点就是么该节点就是Text节点。节点。Text节节点点使使用用StringgetWholeText()方方法法获获取取节节点点中中的的文文本(包括其中的空白字符)。本(包括其中的空白字符)。例题例题6.4p143,例题例题6.5
21、p1452009-10-20176.6AttrAttr节点节点 在在XMLXML文文件件中中,属属性性并并不不是是标标记记的的子子标标记记,因因此此,在在DOMDOM规规范范中中,AttAtt节节点点也也不不是是ElementElement节节点点的的子子节节点点。如如果果想想解解析析XMLXML文文件件中中标标记记的的属属性性,必必须须让让对对应应的的ElementElement节节点调用调用点调用调用 NamedNodeMapgetAttributes()方法。方法。 该该方方法法返返回回的的NamedNodeMapNamedNodeMap对对象象由由有有节节点点组组成成,这这些些节点可以
22、被转换为节点可以被转换为AttrAttr节点。节点。 AttrAttr节节点点通通过过调调用用StringgetName()方方法法返返回回属属性性的的名名字、调用字、调用StringgetValue()方法返回属性的值。方法返回属性的值。 例题例题6.6p1462009-10-20186.7DocumentTypeDocumentType节点节点 DocumentTypeDocumentType节点是节点是DocumentDocument节点的一个子节点。节点的一个子节点。 DocumentTypeDocumentType节点对应着节点对应着XMLXML文件所关联的文件所关联的DTDDTD文
23、件,文件,通过进一步获取该节点子孙节点来分析通过进一步获取该节点子孙节点来分析DTDDTD文件中的数据。文件中的数据。DocumentDocument节点调用节点调用getDoctype() 返回当前节点的返回当前节点的DocumentTypeDocumentType子节点。子节点。例题例题6.7p1482009-10-20196.8处理空白处理空白 标记之间的缩进区域是为了使得标记之间的缩进区域是为了使得XMLXML文件看起来更美文件看起来更美观很形成的,但解析器并不知道这一点,所以解析器仍观很形成的,但解析器并不知道这一点,所以解析器仍然认为它们是有用的文本数据(由空白类字符组成,如:然认
24、为它们是有用的文本数据(由空白类字符组成,如: tnx0Bfrtnx0Bfr)。)。 如如果果想想让让DOMDOM解解析析器器忽忽略略缩缩进进空空白白,即即这这些些缩缩进进空空白白不不在在DocumentDocument中中形形成成TextText节节点点,那那么么XMLXML文文件件必必须须是是有有效效的的,而而且且所所关关联联的的DTDDTD文文件件必必须须规规定定XMLXML文文件件的的标标记记不不能能有有混混合合内内容容,同同时时DocumentBuilderFactoryDocumentBuilderFactory对对象象在在给给出出DOMDOM解析器之前,必须调用解析器之前,必须调
25、用setIgnoringElementContentWhitespace(booleanwhitespace)进进行设置,将参数行设置,将参数whitespacewhitespace的的取值为的的取值为true。例题例题6.8p1502009-10-20206.9验证规范性和有效性验证规范性和有效性 JAXP(Java API for XML Parsing)提供的解析器默认地检提供的解析器默认地检查查XMLXML文件是否是规范的,并不检查文件是否是规范的,并不检查XMLXML文件是否是有效文件是否是有效的,也就是说,的,也就是说,DOMDOM解析器调用解析器调用parse()方法时,如果方法
26、时,如果XMLXML文件是规范的,文件是规范的,parse()方法就返回一个实现了方法就返回一个实现了DocumentDocument接口的对象,否则将显示接口的对象,否则将显示XMLXML文件中不符合规范的错误信文件中不符合规范的错误信息。息。 即即使使XMLXML文文件件关关联联了了一一个个DTDDTD,解解析析器器也也并并不不检检查查XMLXML文文件件是是否否是是有有效效的的,即即不不检检查查XMLXML文文件件是是否否遵遵守守该该DTDDTD规规定定的的限限制制条条件件。如如果果想想要要检检查查一一个个XMLXML文文件件是是否否有有效效,必必须须让让DocumentBuilderF
27、actoryDocumentBuilderFactory对对象象factoryfactory事事先先设设置置是是否否检查检查XMLXML文件的有效性文件的有效性. .如:如: factory.setValidating(true);2009-10-20216.10使用使用DOMDOM生成生成XMLXML文件文件 对于一个给定的对于一个给定的XML文件,通过使用文件,通过使用解析器可以在内存中建立和解析器可以在内存中建立和XML结构相结构相对应的树形结构数据。对应的树形结构数据。JAXP也能让我们也能让我们使用内存中的树形结构数据建立一个新使用内存中的树形结构数据建立一个新的的XML文件。文件。
28、2009-10-20226.10.1TransformerTransformer对象对象 可可以以对对Document节节点点进进行行修修改改,然然后后使使用用Transformer对对象象将将一一个个Document节节 点点变变 换换 为为 一一 个个 XML文文 件件( Transformer类类 在在javax.xml.transform包中)包中), ,需要经过如下步骤:需要经过如下步骤: 1. .使用使用javax.xml.transform包包中的中的TransformerFactory类类建立一个对象:建立一个对象: TransformerFactory transFactor
29、y=TransformerFactory.newInstance(); 2. .使使 用用 步步 骤骤 1中中 得得 到到 的的 transFactory对对 象象 调调 用用 newTransformer()方方 法法 得得 到到 一一 个个Transformer对象对象:Transformer transformer=transFactory.newTransformer(); 3. .将将被被变变换换的的Document对对象象封封装装到到一一个个DOMSource对对象象中中(DOMSource类类在在javax.xml.transform.dom包中):包中): DOMSource
30、domSource=new DOMSource(document); 4. .将将变变换换要要得得到到XML文文件件对对象象封封装装到到一一个个StreamResult对对象象中中(StreamResult类类在在javax.xml.transform.stream包中):包中): File file=new File(newXML.xml); FileOutputStream out=new FileOutputStream(file); StreamResult xmlResult=new StreamResult(out); 5.最后最后Transformer 对象对象transform
31、er 调用调用transform方法方法实施变换实施变换 transformer.transform(domSource,xmlResult);2009-10-20236.10.2用于修改用于修改DocumentDocument的常用方法的常用方法 Node接接口口是是Document的的父父接接口口,提提供供了了许许多多用用来来修修改改、增增加加和删除节点的方法:和删除节点的方法:Node appendChild(Node newChild) Node removeChild(Node oldChild) throws DOMException Node replaceChild(Node
32、newChild, Node oldChild) Attr removeAttributeNode(Attr oldAttr) void setAttribute(String name, String value) Text replaceWholeText(String content) void appendData(String arg) void insertData(int offset, String arg) void deleteData(int offset,int count) void replaceData(int offset,int count, String arg)2009-10-20246.10.3用用DOMDOM建立建立XMLXML文件文件 例题例题6.9p153,例题例题6.10p1562009-10-2025