版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第10章 XML与Java 返回主页 上一章 下一章教学提示:一个单独的XML文件不能做任何的工作,它需要与应用程序结合来实现各种功能,应用程序通过XML解析器和XML应用程序接口处理XML文件。本章介绍了Java程序如何使用DOM解析XML文件。JAXP 提供的类和方法,可以让Java应用程序使用DOM解析或转换XML文件。教学要求:了解Java的特点,熟悉Java的开发环境JDK的安装和配置,掌握Java使用DOM加载XML的方法,掌握访问XML元素和属性的方法,掌握使用DOM创建XML文件的方法,学会转换XML文件为HTML的方法。10.1 Java语言简介10.2
2、Java的开发环境10.3 Java程序加载XML文件10.4 Java程序中访问XML元素和属性10.5 Java程序中XML文件的转换小 结习 题写字版 绘图板 进入Editplus10.1 Java语言简介 本章开头 下一节10.1.1 Java的诞生Java来自于Sun公司的一个叫Green的项目,其原先的目的是为家用消费电子产品开发一个分布式代码系统,这样可以把E-mail发给电冰箱、电视机等家用电器,对它们进行控制,和它们进行信息交流。开始,准备采用C+,但C+太复杂,安全性差。1991年,Sun公司的Jame Gosling、Bill Joe等人开发了一种新的
3、语言Oak(Java的前身),Oak是一种用于网络的精巧而安全的语言,Sun公司曾以此投标一个交互式电视项目,但结果是被SGI打败。可怜的Oak几乎无家可归,恰巧这时Mark Andersen开发的Mosaic和Netscape启发了Oak项目组成员,他们用Java编制了HotJava浏览器,得到了Sun公司首席执行官Scott McNealy的支持,触发了Java进军Internet.Java的取名也有一趣闻。有一天,几位Java成员组的会员正在讨论这个新的语言取什么名字,当时他们正在咖啡馆喝着Java(爪哇)咖啡,有一个人灵机一动说不如就叫Java,得到了其他的人的赞赏,于是,Java这个
4、名字就这样传开了。10.1.2 Java语言的特点根据Sun公司的“Java白皮书”中对Java的定义,Java是一种简单、面向对象、分布式、解释性、健壮、安全、结构中立、可移植、高性能、多线程、动态的语言。1)简单性 Java语言是一种面向对象的语言,它通过提供最基本的方法来完成指定的任务,只需理解一些基本的概念 ,就可以用它编写出适合于各种情况的应用程序。 Java语言是一种类似C+的面向对象的语言,因此,C+程序员可以很快就掌握Java编程技术。Java摒弃了C+中容易引发程序错误的地方,如指针的内存管理。Java提供了丰富的类库,使编程比较容易。2)面向对象Java语言的设计集中于对象
5、及其接口,对象中封装了它的状态变量以及相应的方法 ,实现了模块化和信息隐藏;而类则提供了一类对象的原型,并且通过继承机制,子类可以使用父类所提供的方法,实现了代码的复用。它提高了简单的类机制及动态的接口模型,是纯面向对象编程语言,它不支持类似C语言那样的面向过程的程序设计技术。Java支持静态和动态风格的代码继承及复用。3)分布式Java包括一个支持HTTP和FTP等基于TCP/IP协议的子库。因此,Java应用程序可凭借URL打开并访问网络上的对象,其访问方式与访问本地文件系统几乎完全相同。为分布式环境尤其是Internet提供动态内容无疑是一项非常困难的任务,但Java的语法特性却使我们很
6、容易实现这项目标。4)解释性Java解释器(运行系统)能直接运行目标代码指令。链接程序通常比编译程序所需资源少,所以程序员可以在创建源程序上花上更多的时间。5)健壮性Java在编译和运行程序时,都要对可能出现的问题进行检查,以消除错误的产生。它提供自动垃圾收集来进行内存管理,防止程序员在管理内存时容易产生的错误。通过集成的面向对象的例外处理机制,在编译时,Java提示出可能出现但未被处理的例外,帮助程序员正确地进行选择以防止系统的崩溃。另外,Java在编译时还可捕获类型声明中的许多常见错误,防止动态运行时不匹配问题的出现。6)安全性Java的安全性可从两个方面得到保证。一方面Java语言不支持
7、指针和释放内存等C+的功能,这样就避免了非法内存操作。另一方面,类装载通过将本机类与网络资源类的名称分开,来保持安全性。因此调入类时总要经过检查,这样避免了“特洛伊木马”现象的出现。7)结构中立另外,为了使Java作为网络的一个整体,Java程序将它的程序编译成一种结构中立的中间文件格式。只要有Java运行系统的机器都能执行这种中间代码。 8)可移植性与平台无关的特性使 Java程序可以方便地被移植到网络上的不同机器。同时Java的类库中也实现了与不同平台的接口,使这些类库可以移植。另外Java编译器是由 Java语言实现的,Java运行时系统由标准C实现 ,这使得Java系统本身也具有可移植
8、性。 9)高性能如果解析器速度不慢,Java可以在运行时直接将目标代码翻译成机器指令。从而得到较高的性能。10)多线程Java提供多线程功能使得在一个程序里可同时执行多个小任务,而且同步机制保证了对共享数据的正确操作。通过使用多线程可以很容易地实现网络上的实时交互行为。11)动态性Java的动态特性是其面向对象设计方法的扩展。它允许程序动态地装入运行过程中所需要的类,这是C+语言进行面向对象程序设计所无法实现的。而且Java通过接口来支持多继承,使之比严格的类继承具有更灵活的方式和扩展性。10.1.3 Java带来的影响Java虽出现的时间不长,但已被业界接受,IBM、Apple、DEC、Ad
9、obe、SiliconGraphics、HP、Oracle、Toshiba、NetScape和Microsoft等大公司已经购买了Java的许可证。Microsoft还在其Web浏览器Explorer 3.0版中增加了对Java的支持。另外,众多的软件开发商也开发了许多支持Java的软件产品。如:Borland公司的基于Java的快速应用程序开发环境Latte;Metrowerks公司和Natural Intelligence公司分别开发的基于Machintosh的Java开发工具;Sun公司的Java开发环境Java Workshop;Microsoft也开发出系列Java产品。数据库厂商如
10、Illustra, Sybase, Versant, Oracle都在开发支持HTML和Java的CGI(Common Gateway Interface)。在以网络为中心的计算时代,不支持HTML和Java,就意味着应用程序的应用范围只能限于同质的环境。Internet正在成为企业信息系统最佳的解决方案。它的优点表现在:便宜、易于使用和管理。用户不管使用何种类型的机器和操作系统,界面是统一的Web浏览器,而数据库、Web页面、应用程序(用Java编的applet)则存在WWW服务器上。开发人员只需维护一个软件版本,管理人员省去了为用户安装、升级、培训之苦,用户则只需一个操作系统和
11、一个Internet浏览器足矣。我们可以设想未来的计算方式,每个HomePage的实质是一个多媒体应用程序,这些程序用Java来开发。Java应用程序运行在异质的机器、异质的操作系统之上,甚至于电冰箱、烤面包箱、防盗电子设备之中,用Internet把所有的电子设备连接起来,通过TCP/IP进行信息的交流。Java应用程序之间既可以交换消息,也可以交换程序(一个Java的小应用程序applet)。或许有一天,我们可以在Netscape浏览器里查看电冰箱的温度,向烤面包箱发一个电子邮件。Java的出现是计算机信息交换的一个重要里程碑。在单机时代,程序进程之间靠共享存储进行变量交换;在网络时代,运行
12、在不同宿主机上的程序按网络协议进行无格式的消息(二进制字符流)交换,消息的语义由交换程序双方维护;在Java时代,运行在网络上的程序进程交换的是小应用程序(applet)。小应用程序是什么?它是一个对象,由一组属性和方法构成,是一个可执行的实体;不仅有数据的状态,而且有定义在数据上的操作。未来可能进行代理(Agent)交换,代理有一定的智能性,那便是信息交换的更高级阶段。随着Internet的崛起、Java的诞生,巨型的、臃肿的应用软件开始向小型化发展,由众多“生活”在Internet上的小应用程序(applet)相互协作完成信息的处理与传递。Java会加速应用软件的小型化、网络化的趋势。随着
13、Internet的发展,软件必然是面向“大众”,而不是“少数人”的奢侈品,薄利多销将是网络应用软件的重要特点。分布式对象技术保证了用多少,下载多少。Java连同Internet, WWW正在改变应用软件的开发和使用方式,一切都要围绕着网络,围绕着平台无关。很多人认为,Word, Excel等传统的信息处理工具都必然走向萎缩,因为它们是单机时代的产物。信息的价值在于使用和共享,Internet和Web是信息的使用和共享最快捷、最便宜的方式,Word将演化成为Web写作工具,Excel则将演化成Web上的电子表格。 10.2 Java的开发环境 上一节 下一节 本章开头Java程序的开发
14、环境需要安装Sun公司的JDK,然后配合Windows的记事本或其他编辑工具建立Java应用程序。10.2.1 JDK的安装Java开发工具“Java Development Kit”(JDK)拥有很多版本,本章使用JDK1.4版,这个版本内含JAXP API1.1版。我们可以从免费下载此开发工具。虽然Java是跨平台的,但在各种平台时的安装方式却各不相同,下载时要选择支持的操作系统和语言下载。下载好后即可运行安装了。这里主要介绍Windows操作系统下的J2sdk1.4.2_07-win.exe安装过程。JDK的安装比较简单,和安装其他的软件没有什么区别,安装过程介绍如下:1)双击下载后的J
15、2sdk1.4.2_07-win.exe,先出现欢迎安装的向导界面,然后出现版权协议说明界面,接受版权协议后,单击【Next】按钮,如图10.1所示。2)出现选择安装组件的界面和安装路径,默认路径是c:j2sdk1.4.2_07,如图10.2所示。3)选择浏览器,然后单击【Next】按钮继续安装,如图10.3所示。4)对JDK进行安装,如图10.4所示,安装完毕后,单击【Finish】按钮结束安装。 图10.1 版权协议界面图10.2 选择安装组件和安装路径的界面图10.3选择浏览器界面图10.4复制文件进行安装的界面10.2.2 JDK的配置安装好 JDK, 还需要更新Path路径
16、变量,假设JDK安装在c:j2sdk1.4.2_07目录下。下面以Windows 2000、XP操作系统为例来进行配置。在桌面上用鼠标单击【我的电脑】,选择【属性】菜单,出现【属性】对话框,选择【高级】标签页,如图10.5。单击【环境变量】按钮后,如图10.6所示。找到系统变量Path,编辑Path变量的值,在Path值域的文本框后面加上c:j2sdk1.4.2_07bin。在系统变量中新建classpath变量,将其值设置为c:j2sdk1.4.2_07lib,一般情况下这个路径下的java包已经够用。有些特殊用途的java程序需要特定的包支持,可以将需要的包拷贝到这个路径下。用户开发的类或
17、包也需要把其所在路径追加到classpath中,用分号与前面已有路径隔开。如果要用到JSP服务或者J2EE架构,还需要设置JAVA_HOME等环境变量。图10.5 【属性】对话框图10.6 【环境变量】对话框10.3 Java程序加载XML文件 上一节 下一节 本章开头为了简化编写处理 XML 的 Java 程序,已经建立了多种编程接口。这些接口或者由公司定义,或者由标准体或用户组定义,以满足 XML 程序员的需要。以下列出了四种接口: · Document Object Model(DOM,文档对象模型),Level 2 · Simple API
18、for XML (SAX), Version 2.0 · JDOM, Jason Hunter 和 Brett McLaughlin 创立的一种简单 Java API · Sun推出JAXB(Java Architecture for XML Binding) 这四种接口中DOM是W3C的正式推荐,本章主要介绍Java应用程序如何使用DOM解析或转换XML文件。要创建 DOM 或 SAX 解析器,需要使用 JAXP(Java API for XML Processing)。 10.3.1 JAXP的简介 JAXP使得用Java语
19、言开发处理XML数据的应用程序非常容易,JAXP包括词法分析器、标准SAX与DOM,可以选择以事件流或建立对象表示来解析数据。JAXP1.1版本还支持XSLT标准,可以控制数据的表示,并可以将数据转换成其它XML文件或其它格式,如HTML。JAXP还提供对名称空间的支持,可以在没有命名冲突的情况下使用DTD。JAXP 提供的类和方法,可以让Java应用程序使用DOM解析或转换XML文件,在JDK1.4支持的JAXP API 1.1版支持XML,建议规格DOM Level 2、XSLT 1.0和SAX 2.0。其解析文档对象模型的相关套件,如表12-1所示:表10-1 JAXP AP
20、I 1.1解析文档对象模型的相关套件套 件说 明Javax.xml.parsers提供处理XML文件的类Javax.xml.transform提供处理XSLT文件的类org.xml.sax这是SAX解析器,提供以事件驱动方式解析XML文件的APIorg.xml.saxhelpers提供解析错误处理的相关类,可以帮助程序设计者使用SAXAPIOrg.w3c.dom提供支持DOM建议规格的套件10.3.2 常用的DOM接口DOM定义了一套标准的接口以便按照程序的设计显示XML文档。当然。DOM不是一种实现,支持DOM的XML解析器必须实现DOM所定义的接口。最常用的几个DO
21、M接口对象可见第九章的表9-3所示,这里不再赘述。10.3.3 加载XML文档文件在Java程序中加载XML文档文件,步骤如下:1)首先需要导入相关的套件,如下所示:import javax.xml.parsers.*;import org.xml.sax.*;import org.w3c.dom.*;import java.io.*;其中org.xml.sax.*套件是解析错误处理的相关套件,此外因为XML文件属于文本文件,所以导入文件处理的套件import java.io.*。2)在JAXP中,DOM解析器称为“DocumentBulider”,可以通过工厂类DocumentBulider
22、Factory获得,而Document对象则可以通过类DocumentBulider获得,使用try catch指令建立解析的错误处理。在建立DocumentBulider对象后,可使用parser方法解析加载XML文件,这是一个File对象加载后就可以处理XML文件的节点内容。其程序块的架构如下所示:/获得一个XML文件的解析器DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); try /解析XML文件生成DOM文档的接口类,以便访问DOM
23、0; DocumentBuilder db=dbf.newDocumentBuilder(); document=db.parser(new File(args0); . catch(SAXException se) /解析过程错误 Exception e=se; if(se.getException()!=null)
24、160; e=se.getException(); e.printStackTrace(); catch(ParserConfigurationExcepion pe) /解析器设定错误 pe.printStackTrace(); catch(IOException ie) &
25、#160; /文件处理错误 ie.printStacktrack(); 3)获得接口类Document实例后,就可以对DOM的文档树进行访问。如要遍历DOM文档,首先要获得根节点,然后获得根节点的子节点列表。 /获得根节点Element element=document.getDocumentElement(); /获得根节点的子节点列表 Nodelist=element.getChildNodes();【例10.1】显示加载
26、的外部XML文件所有节点的名称和值,code10_1.java,显示结果如图10.7。这里通过递归方法实现遍历的目的。import javax.xml.parsers.*;import org.xml.sax.*;import java.io.*;import org.w3c.dom.*;public class code10_1 static Document document; public static void main(String args) if(args.length!=1)
27、 System.out.println("加载xml file"); return; DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); try DocumentBuilder db=dbf.newDocumentBuilder(); /读入XML文档
28、0; document=db.parse(new File(args0); /遍历XML文档 walkNode(document.getDocumentElement(); catch(SAXException se) /解析过程错误 Exception e=se;
29、0; if(se.getException()!=null) e=se.getException(); e.printStackTrace(); catch(ParserConfigurationException pe) /解析器设定错误
30、 pe.printStackTrace(); catch(IOException ie) /文件处理错误 ie.printStackTrace(); private static void walkNode(Node anode)
31、60; NodeList child=anode.getChildNodes(); printNode(anode); for(int i=0;i<child.getLength();i+) Node node=child.item(i);
32、60; if(node.hasChildNodes() walkNode(node); else printNode(node); &
33、#160; private static void printNode(Node anode) System.out.println(anode.getNodeName()+","+anode.getNodeValue(); 被引用的XML文件为code10_1.xml: <?xml version="1.0" encoding="gb2312" ?><customers
34、> <customer ID="c0500103" > <username>cheaperget</username> <password>12345678</password> <email>notknown</email> <registerdate>200508</registerdate> <address>
35、160; <zipcode>361021</zipcode> <phone>lt;/phone> <street>XX省XX市银江路108号</street> </address> </customer> <customer
36、ID="c0500208" > <username>dreamingboy</username> <password>22345678</password> <email>greatman</email> <registerdate>200505</registerdate> <address> &
37、#160; <zipcode>215006</zipcode> <phone>lt;/phone> <street>XX省XX市人民路616号</street> </address> </customer></customers> 图10.7 例10.1运
38、行结果本例中遍历了XML文档的所有节点,并显示出了所有节点的名称和值。从结果中可以看出有许多#text节点,其中一些是表示文本节点,如#text,cheaperget和#text,12345678;还有的表示XML文件中行与行之间的换行符和空格符,如customers,null后的#text就是XML文件中第二行与第三行之间的换行符和空格符。如何去掉这些多余的#text节点呢?我们可以把XML文档中的换行符和空格符去掉,再重新运行程序,将会发现这些多余的#text节点全都没有了。可是把XML文档中的换行符和空格符去掉后,XML可读性就非常差,怎样解决这个问题呢?我们可以在加载文件时并设定参数。
39、10.3.4 设定加载XML文件的参数DocumentBuilderFactory类提供相关方法可以设定解析器解析XML文件的方式,例如:是否忽略文字或whitespace内容的元素等,如表10.2所示: 表10.2 加载XML文件的参数 方 法说 明setCoalesing(Boolen)设置解析器CDATA节点转换成TEXT文字节点和新增在其相邻文字节点之后(如果有的话),默认值为false,true表示转换setExpandEntityReferencedes(boolen)设置解析器展开实体参考的节点,默认
40、值为true表示展开,false表示不展开setIgnoringComments(boolen)设置解析器忽略注释文字,默认值为false,true表示不忽略SetIgnoringElementContentWhitespace(boolen)设置解析器忽略元素内容为whitespace空白字节的节点,默认值为false,true表示忽略【例10.2】加载外部code10_2.xml文件(此XML文件拥有DTD文件),并设定解析器参数,然后显示所有节点的名称和值,code10_2.java,显示结果如图10.8。import javax.xml.parsers.*;import org.xml
41、.sax.*;import java.io.*;import org.w3c.dom.*;public class code10_2 static Document document; public static void main(String args) if(args.length!=1) System.out.println("加载xml file"); return;
42、; DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); try /设定解析参数 dbf.setIgnoringElementContentWhitespace(true); DocumentBuilder db=dbf.newDocumentBuilder(); /读入XML文档&
43、#160; document=db.parse(new File(args0); /遍历XML文档 walkNode(document.getDocumentElement(); catch(SAXException se) /解析过程错误 Exception e=se; &
44、#160; if(se.getException()!=null) e=se.getException(); e.printStackTrace(); catch(ParserConfigurationException pe) /解析器设定错误
45、60; pe.printStackTrace(); catch(IOException ie) /文件处理错误 ie.printStackTrace(); private static void walkNode(Node anode)
46、 NodeList child=anode.getChildNodes(); printNode(anode); for(int i=0;i<child.getLength();i+) Node node=child.item(i);
47、 if(node.hasChildNodes() walkNode(node); else printNode(node);
48、0; private static void printNode(Node anode) System.out.println(anode.getNodeName()+","+anode.getNodeValue(); 图10.8 例10.2 运行结果被引用的XML文件为code10_2.xml<?xml version="1.0" encoding="gb2312"?><!DOC
49、TYPE customers SYSTEM "code10_2.dtd"><customers> <customer ID="c0500103"> <username>cheaperget</username> <password>
50、;12345678</password> <email>notknown</email> <registerdate>200508</registerdate> <address>
51、 <zipcode>361021</zipcode> <phone>lt;/phone> <street>XX省XX市银江路108号</str
52、eet> </address> </customer> <customer ID="c0500208"> <username>dreamingboy</username>
53、0; <password>22345678</password> <email>greatman</email> <registerdate>200505</registerdate>
54、0; <address> <zipcode>215006</zipcode> <phone>lt;/phone>
55、; <street>XX省XX市人民路616号</street> </address> </customer></customers>10.4 Java程序中访问XML元素和属性 上一节 下一节 本章开头如果仔细分析例10.2的运算结果,会发现元素的属性没有显示出来,如何显示出元素的属性呢?从第九章的学习,我们知道DOM是
56、由W3C制订的用于处理XML文件和HTML文件的API。在应用程序中,基于DOM的XML解析器将一个XML文档转换成一个类似于树的对象模型集合,通常称为DOM树。在这棵树中,包含了XML文档所有内容,并都用节点表示。首先来看一下XML文档常见的节点的种类,如表10-3所示:表10-3 XML文件节点种类节点类型说 明NODE_DOCUMENT_TYPE<!DOCTYPE node SYSTEM “code10_2.dtd”>NODE_PROCESSING_INSTRUCTION<?xml vertion=”1.0”>NODE_ELEM
57、ENT<username>cheaperget</username>NODE_ATTRIBUTEID="c0500103"NODE_TEXTcheaperget表中列出了节点种类的常数名称,当DOM加载XML文件后,Java程序代码看到的XML文件内容就是表中各种节点组成的一棵树状结构,而节点本身还可能包含一些信息,例如节点的名字、节点值、节点的类型等,因此DOM树中的节点是对象,对象包含方法与属性。下面我们就看如何使用节点的方法来访问节点的属性。 10.4.1 访问XML元素和属性上节例10.2中我们已经遍历了DOM树中的所有元素,如果仔细分析的运
58、算结果,会发现元素的属性没有显示出来,如何显示出元素的属性以及访问元素呢?下面我们来进行详细讲解。在DOM接口规范中,有四个基本接口:Document、Node、NodeList、Element。在这四个基本接口中,Document接口是对文档进行操作的入口,它是从Node接口继承过来的。Node接口是其他大多数接口的父类,像Document、Element、Text、Comment等接口都是从Node接口继承过来的。NodeList接口是一个节点的集合,它包含了某个节点中的所有子节点。下面我们来对这几个接口分别做一些简单的介绍。1.Document接口Document接口代表了整个XML文档
59、,因此,它是整个文档树的根,提供了对文档中的数据进行访问和操作的入口。通过Document节点,可以访问到文档中的其他节点,如处理指令、批注、文字等。方法描述:1)getDocumentElement() Document文件对象使用该方法可获取XML文件的根节点;2)getElementsByTagName() Document使用标记名获取子节点,取出的节点是一个NodeList对象。2.Node接口Node接口在整个DOM树中具有举足轻重的地位,DOM接口中很大一部分接口是从Node接口继承过来的,例如Document、Element、Text、Comment等
60、接口,都是从Node接口继承过来的。在DOM树中,Node接口代表了树中的一个节点。方法列表:1)getChildNodes() 获取子节点的NodeList节点对象列表,即子节点数;2)getNodeName() 返回节点名称,不同节点种类的值不同;3)getNodeType() 返回节点种类的代码;4)getNodeValue() 返回节点的值;5)getFirstChild() 获取第一个子节点;6
61、)getNextSibling() 获取此节点的兄弟节点,即同级的下一个节点;7)getLastChild() 获取最后一个子节点;8)getParentNode() 获取父节点;9)hasChildNodes() Node节点对象检查是否拥有子节点,是返回true,否则为false。3.NodeList接口NodeList接口提供了对节点集合的抽象定义,它并不包含如何实现这个节点集的定义。NodeList用于表示有顺序关系的一组节点,比如某个节点的子节点序列。N
62、odeList中的每个item都可以通过一个索引来访问,该索引值从0开始。另外,它还出现在一些方法的返回值中,例如GetNodeByName。方法列表:1)getLength() 可获取NodeList对象共有多少节点,即节点的个数;2)item(int) 返回参数制定的节点对象,参数是节点对象的索引值。4.Element接口Element接口是从Node接口继承过来的,它代表了XML文档中的元素。Element接口提供了访问DOM树中元素内容与信息的途径,并给出了对DOM树中的元素进行遍历的支持。方法列表:1)getElementsByTagName(St
63、ring) 通过标签名称获取元素;2)getTagName() 获取元素的标签的名称;3)getAttributes(String) 获取元素的属性,是属性对象列表,属于NamedNodeMap;4)getAttributeNode(String) 通过属性的名字得到一个属性类型节点。5NamedNodeMap属性列表对象NamedNodeMap对象可以获取元素的属性列表,因为一个元素可能拥有多个属性。可以使用getAttributes获取属性列表。下面我们通过一个实例来说
64、明如何使用上述对象和方法来解析一个XML文档【例10.3】使用DOM对象和方法访问XML文件的元素与属性,code10_3.java。XML文件为code10_1.xml,显示结果如图10.9import javax.xml.parsers.*;import org.xml.sax.*;import java.io.*;import org.w3c.dom.*; public class code10_3 static Document document; public static void main(String args) if(ar
65、gs.length!=1) System.out.println("加载xml file"); return; DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); try DocumentBuilder db=dbf.newDocumentBui
66、lder(); /读入XML文档 document=db.parse(new File(args0); /获得根元素 Node root=document.getDocumentElement(); /获得根元素的子节点列表 NodeList childs=root.getChildNodes();
67、 GetElement(childs); catch(SAXException se) /解析过程错误 Exception e=se; if(se.getException()!=null) e=se.getException();
68、0; e.printStackTrace(); catch(ParserConfigurationException pe) /解析器设定错误 pe.printStackTrace(); catch(IOException ie) /文件处理错误
69、60; ie.printStackTrace(); public static void GetElement(NodeList childs) int i=0; if(childs.getLength()=0) /该节点没有子节点
70、160; System.out.println("该节点没有子节点!"); for(i=0;i<childs.getLength();i+) /获取第i个子节点
71、160; Node node=childs.item(i); /获取节点的类型,可以是ElementNode,TextNode,DocumentNode等 short nodetype=node.getNodeType();
72、160; /*ElementNode类型的节点可包含子节点和属性等*/ if(nodetype=Node.ELEMENT_NODE) /得到节点名称
73、60; String name=node.getNodeName(); String attrValue="",attrName="" System.out.println("this is element! name is:"+name);
74、; if(node.hasAttributes() /*取出一个元素的属性,得到的是一个属性对象列表(NameNodeMap),在此因为xml文档中元素只有一个属性,所以只取NameNode
75、Map中的第“0”个值。*/ Node attrNode=node.getAttributes().item(0); /*取出该属性节点的Name和Value,即是一个ElementNode的属性名称和属性值*/
76、160; attrName=attrNode.getNodeName(); attrValue=attrNode.getNodeValue(); System.out.println("this eleme
77、nt attr is:"+attrValue+"attrnameis:"+attrName); /如有子节点,递归调用GetElement() if(node.hasChi
78、ldNodes() GetElement(node.getChildNodes(); /*Text类型节点没有子节点,节点名为#text,节点的值为xml文档中元素的值*/
79、60; if(nodetype=Node.TEXT_NODE) /该节点的name是"#text" String txtName=node.getNodeName(); /取出Text类型节点的值 Node thisparent=node.getParentNode(); Node txtNode=th
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 云南省师范大学附属中学2021届高三高考适应性月考卷(三)文科综合试题扫描版含答案
- 【状元之路】2020-2021学年新课标生物选修1-专题测评(六)植物有效成分的提取
- 四年级数学(四则混合运算)计算题专项练习与答案
- 三年级数学(上)计算题专项练习附答案
- 【状元之路】2020-2021学年高中政治必修1一课一练:第六课-投资理财的选择
- 2021高考化学考点突破训练:11-3烃的含氧衍生物
- 《金版教程》2022届高考生物一轮总复习限时规范特训-2-6细胞器-系统内的分工合作-
- 多媒体课件制作
- 《肝脏CT分段》课件
- 社会主义建设理论与实践 第三版 课件 第七章 社会主义国家生态文明建设;第八章 社会主义国家执政党建设
- 安徽省合肥市蜀山区2023-2024学年五年级上学期期末质量检测科学试题
- 切尔诺贝利核电站事故工程伦理分析
- 采购部年终总结计划PPT模板
- CDI-EM60系列变频调速器使用说明书
- 【汇总】高二政治选择性必修三(统编版) 重点知识点汇总
- 材料表面与界面考试必备
- 骨科重点专科省级市级申报材料
- 焦点CMS用户手册
- 丙酮-水连续精馏塔的设计
- 菜鸟也上手:最最完整的Cool Edit Pro 图文操作手册
- 现金流量表附表的编制方法
评论
0/150
提交评论