目录
第1章 成为程序员 1.1 选择编程语言 1.2 告诉计算机做什么 1.3 程序的工作原理 1.4 为什么程序不能正常工作 1.5 选择 Java编程工具 1.6 安装 Java开发工具 1.7 总结 1.8 问与答 1.9 测验 1.9.1 问题 1.9.2 答案 1.10 练习 第2章 编写第一个程序 2.1 编写程序所需的工具 2.2 创建 Saluton 程序 2.3 开始输入程序 2.3.1 class语句 2.3.2 main语句的作用 2.3.3 大括号 2.4 在变量中存储信息 2.5 保存编写好的程序 2.6 将程序编译为 class文件 2.7 修复错误 2.8 运行 Java程序 2.9 总结 2.10 问与答 2.11 测验 2.11.1 问题 2.11.2 答案 2.12 练习 第3章 Java之旅 3.1 第一站:Oracle 3.2 去 Java学校 3.3 在 JavaWorld 用午餐 3.4 在 NASA仰望天穹 3.5 回归正题 3.6 到 Java Boutique 去问路 3.7 在手机上运行 Java 3.8 总结 3.9 问与答 3.10 测验 3.10.1 问题 3.10.2 答案 3.11 练习 第4章 理解Java程序的工作原理 4.1 创建应用程序 4.2 向应用程序传递参数 4.3 创建 applet 4.4 总结 4.5 问与答 4.6 测验 4.6.1 问题 4.6.2 答案 4.7 练习 第5章 在程序中存储和修改信息 5.1 语句和表达式 5.2 指定变量类型 5.2.1 整数和浮点数 5.2.2 字符和字符串 5.2.3 其他数值类型的变量 5.2.4 布尔型变量 5.3 给变量命名 5.4 在变量中存储信息 5.5 运算符 5.5.1 变量的递增与递减 5.5.2 运算符优先级 5.6 使用表达式 5.7 总结 5.8 问与答 5.9 测验 5.9.1 问题 5.9.2 答案 5.10 练习 第6章 使用字符串来交流 6.1 在字符串中存储文本 6.2 在程序中显示字符串 6.3 在字符串中使用特殊字符 6.4 拼接字符串 6.5 将其他变量用于字符串中 6.6 字符串的高级处理 6.6.1 比较两个字符串 6.6.2 确定字符串的长度 6.6.3 改变字符串的大小写 6.6.4 查找字符串 6.7 导演及演员名单 6.8 总结 6.9 问与答 6.10 测验 6.10.1 问题 6.10.2 答案 6.11 练习 第7章 使用条件测试进行判断 7.1 if语句 7.1.1 小于和大于的比较 7.1.2 相等和不等 7.1.3 使用块语句组织程序 7.2 if-else 语句 7.3 switch语句 7.4 条件运算符 7.5 观察时钟 7.6 总结 7.7 问与答 7.8 测验 7.8.1 问题 7.8.2 答案 7.9 练习 第8章 使用循环重复执行操作 8.1 for循环 8.2 while 循环 8.3 do-while 循环 8.4 退出循环 8.5 给循环命名 8.6 测试计算机的运行速度 8.7 总结 8.8 问与答 8.9 测验 8.9.1 问题 8.9.2 答案 8.10 练习 第9章 使用数组存储信息 9.1 创建数组 9.2 使用数组 9.3 多维数组 9.4 对数组进行排序 9.5 对字符串中的字符计数 9.6 总结 9.7 问与答 9.8 测验 9.8.1 问题 9.8.2 答案 9.9 练习 第10章 创建第一个对象 10.1 面向对象编程的工作原理 10.2 对象示例 10.3 什么是对象 10.4 理解继承 10.5 建立继承层次 10.6 转换对象和简单变量 10.6.1 简单变量的类型转换 10.6.2 对象类型转换 10.6.3 在简单变量和对象之间进行转换 10.6.4 自动封装和拆封 10.7 创建对象 10.8 总结 10.9 问与答 10.10 测验 10.10.1 问题 10.10.2 答案 10.11 练习 第11章 描述对象 11.1 创建变量 11.2 创建类变量 11.3 用方法来创建行为 11.3.1 声明方法 11.3.2 参数不同的类似方法 11.3.3 构造函数 11.3.4 类方法 11.3.5 方法中变量的作用域 11.4 将一个类放在另一个类中 11.5 使用关键字this 11.6 使用类方法和类变量 11.7 总结 11.8 问与答 11.9 测验 11.9.1 问题 11.9.2 答案 11.10 练习 第12章 充分利用现有对象 12.1 继承的威力 12.1.1 继承行为和属性 12.1.2 覆盖方法 12.2 建立继承 12.3 使用现有的对象 12.4 将相同类型的对象存储到 Vector 中 12.5 创建子类 12.6 总结 12.7 问与答 12.8 测验 12.8.1 问题 12.8.2 答案 12.9 练习 第13章 创建简单的用户界面 13.1 Swing 和抽象窗口工具包 13.2 使用组件 13.2.1 窗口和框架 13.2.2 按钮 13.2.3 标签和文本框 13.2.4 复选框 13.2.5 组合框 13.2.6 文本区域 13.2.7 面板 13.3 创建自己的组件 13.4 总结 13.5 问与答 13.6 测验 13.6.1 问题 13.6.2 答案 13.7 练习 第14章 用户界面的布局 14.1 使用布局管理器 14.1.1 GridLayout管理器 14.1.2 BorderLayout管理器 14.1.3 BoxLayout管理器 14.1.4 使用Insets将组件隔开 14.2 应用程序的界面布局 14.3 总结 14.4 问与答 14.5 测验 14.5.1 问题 14.5.2 答案 14.6 练习 第15章 响应用户输入 15.1 让程序监听 15.2 设置要监听的组件 15.3 处理用户事件 15.3.1 复选框和组合框事件 15.3.2 键盘事件 15.3.3 启用和禁用组件 15.4 完善图形应用程序 15.5 总结 15.6 问与答 15.7 测验 15.7.1 问题 15.7.2 答案 15.8 练习 第16章 创建复杂的用户界面 16.1 滚动窗格 16.2 滑块 16.3 变更监听器 16.4 使用图像图标和工具栏 16.5 总结 16.6 问与答 16.7 测验 16.7.1 问题 16.7.2 答案 16.8 练习 第17章 创建交互式Web程序 17.1 标准applet方法 17.1.1 在applet窗口中绘画 17.1.2 初始化applet 17.1.3 启动和停止applet 17.1.4 销毁applet 17.2 将applet放到Web页面中 17.3 创建applet 17.3.1 在applet窗口中绘画 17.3.2 测试SalutonApplet程序 17.4 从Web页面传递参数 17.5 在applet中接收参数 17.6 在applet中处理参数 17.7 使用object标记 17.8 总结 17.9 问与答 17.10 测验 17.10.1 问题 17.10.2 答案 17.11 练习 第18章 处理程序中的错误 18.1 异常 18.1.1 在try-catch块中捕获异常 18.1.2 捕获多种不同的异常 18.1.3 出现异常后进行处理 18.1.4 抛出异常 18.1.5 忽略异常 18.2 抛出和捕获异常 18.3 总结 18.4 问与答 18.5 测验 18.5.1 问题 18.5.2 答案 18.6 练习 第19章 创建线程程序 19.1 线程 19.1.1 降低程序的速度 19.1.2 创建线程 19.2 使用线程 19.2.1 声明类 19.2.2 创建变量 19.3 从init( )开始 19.4 在创建URL时捕获错误 19.5 在paint( )方法中处理屏幕更新 19.6 启动线程 19.6.1 运行线程 19.6.2 停止线程 19.7 处理鼠标单击 19.8 循环显示链接 19.9 总结 19.10 问与答 19.11 测验 19.11.1 问题 19.11.2 答案 19.12 练习 第20章 读写文件 20.1 流 20.1.1 文件 20.1.2 从流中读取数据 20.1.3 缓冲输入流 20.2 将数据写入流中 20.3 读写配置属性 20.4 总结 20.5 问与答 20.6 测验 20.6.1 问题 20.6.2 答案 20.7 练习 第21章 读写XML数据 21.1 创建XML文件 21.2 读取XML文件 21.3 读取 RSS 聚合内容(Syndication Feeds) 21.4 总结 21.5 问与答 21.6 测验 21.6.1 问题 21.6.2 答案 21.7 练习 第22章 利用JAX-WS开发Web服务 22.1 定义服务端点接口 使用注解来简化Java代码 22.2 创建服务实现Bean 22.3 发布Web服务 22.4 使用Web服务描述语言文件 22.5 创建Web服务客户端 22.6 总结 22.7 问与答 22.8 测验 22.8.1 问题 22.8.2 答案 22.9 练习 第23章 创建Java2D图形 23.1 使用Font类 23.2 使用Color类 23.3 创建自定义颜色 23.4 绘制直线和形状 23.4.1 绘制直线 23.4.2 绘制矩形 23.4.3 绘制椭圆和圆 23.4.4 绘制弧线 23.5 绘制饼图 23.6 总结 23.7 问与答 23.8 测验 23.8.1 问题 23.8.2 答案 23.9 练习 第24章 编写Android app 24.1 Android简介 24.2 创建 Android app 24.2.1 剖析一个Android新项目 24.2.2 创建app 24.2.3 安装Android模拟器 24.2.4 创建调试配置 24.3 运行app 24.4 设计真实的app 24.4.1 组织资源 24.4.2 配置app的Manifest文件 24.4.3 设计用户界面 24.4.4 编写Java代码 24.5 总结 24.6 问与答 24.7 测验 24.7.1 问题 24.7.2 答案 24.8 练习 附录A 使用NetBeans IDE A.1 安装NetBeans A.2 创建新项目 A.3 创建新的Java类 A.4 运行应用程序 A.5 修复错误 附录B Java资源 B.1 可以考虑的其他书 B.2 Oracle公司的 Java官方站点 B.3 其他Java站点 B.3.1 本书英文版的配套网站 B.3.2 Café au Lait B.3.3 Workbench B.3.4 Java 7 Developer Blog B.3.5 其他Java博客 B.3.6 InformIT B.3.7 Stack Overflow B.3.8 Java Review Service B.3.9 JavaWorld杂志 B.3.10 Developer.com’s Java Directory 附录C 本书站点 附录D 设置Android开发环境 D.1 起步 D.2 安装Eclipse D.3 安装 Android SDK D.4 安装在Eclipse中使用的Android插件 D.5 设置你的手机 其他 版权

Java初级教程

Java入门经典
第21章 读写XML数据

本章介绍如下内容:

从文件中读取XML数据;

提取XML元素;

收集一组子元素;

读取XML元素的属性值;

写入XML文件。

在Java于20世纪90年代崛起的同时,计算机软件开发也发生了重大变化,这就是可扩展标记语言(XML)的面世。XML是一种用于组织和存储数据以便程序读取的格式,现在非常流行。

多亏了XML,数据的读写可完全独立于用于创建它的软件。在以往,每个程序都有专用和特有的格式,因此这种改变受到了大家的欢迎。

XML数据可以使用分析器(parser)来读取,分析器是一种能够识别XML格式并提取所需数据的程序。

本章将使用 XML 对象模型(XML Object Model,XOM)来读写 XML 数据,XOM 是一个Java类库,在Java程序中使用XOM,可以方便地处理XML数据。

21.1 创建XML文件

在讲解XOM之前,应该学习一些有关XML及其如何存储数据的知识。XML数据无处不在,可存储在文件中,可通过Internet网络传输,可以存储在内存中。

Java 类库中有多个可读写XML的类,其中包括java.util包中的Properties类,这个类在第20章介绍过。

Properties对象可存储为XML格式,而不是前一章介绍的name=value格式。

当使用配置属性填充这种对象后,可以使用其 storeToXML( )方法将其保存到 XML 文件中。该方法接受下面两个参数。

一个FileOutputStream对象:通过它将数据存储到文件中。

一条注释:如果数据不需要注释,可以为空字符串“”。

本章的第一个项目是一个简单的应用程序PropertyFileCreator,它将配置属性存储为XML格式。启动NetBeans,在一个新的Java空文件中输入程序清单21.1中的文本,将其命名为PropertyFileCreator,然后保存。

程序清单 21.1 PropertyFileCreator.java 的源代码

运行该程序时,它创建一个包含 3 项设置的属性文件:username 为 rcade,browser 为Mozilla Firefox,showEmail 为 no。

如果这些属性被存储为其他格式,则看起来会如下所示:

运行该应用程序时,它将创建如程序清单21.2所示的XML文件properties.xml。

程序清单 21.2 properties.xml 文件

XML以自我记录(self-documenting)的方式组织数据,这样只需阅读文件本身就能理解其中的数据。

通过观察程序清单21.2,就可以立即知道它是如何存储配置属性的,标记?xml和!DOCTYPE可能不好理解,但文件中的其他内容很容易理解。

XML文件中的数据用标记括起,很像用于编写网页的标记语言HTML。

起始标记以“<”打头,然后是元素名和字符“>”,如程序清单21.2中第3行的<properties>。

结束标记以字符“<”打头,然后是“/”,随后是元素名和“>”,如第8行的</properties>。

位于起始标记和结束标记之间的内容是元素的值。

XML数据必须有一个根元素,它将所有数据括起。在程序清单21.2中,根元素为第3~8行定义的propperties元素。

元素可以包含文本以及一个或多个子元素。元素properties包含4个子元素:1个comment元素和3个entry元素。

下面是其中的comment元素:

该元素包含文本值 Created on Wed Jun 15 20:56:33 EDT 2011。

XML 元素还可以有一个或多个属性,它们是在元素的起始标记中以 name=“value”的方式定义的。属性之间必须用空格分开,它们提供了与元素相关的补充信息。

每个entry元素都有一个属性和一个值:

该元素的值为no,它还有一个值为showEmail的key属性。

程序清单21.2中没有的一种XML元素是,在单个标记内定义的元素。这些元素以字符“<”打头,然后是元素名和字符“/>”。

例如,下面的元素可作为properties元素的子元素:

虽然XML被称为一种类似于HTML的格式,但它本身并非一种语言。相反,XML描述如何根据要使用计算机程序完成的任务创建数据格式。XML格式被称为方言(dialect)。

一个这样的例子是Java的Properties类创建的XML方言。Oracle公司开发这种格式用于表示软件配置设置。

遵循XML格式化规则的数据被称为格式良好的(well-formed),读写XML的软件必须能够接受格式良好的数据。

数据也可以遵循更严格的标准,这种标准被称为有效性(validity)。有效的XML文件在正确的位置包含正确的元素,这要求采取某种方法来定义哪些元素是有效的。

21.2 读取XML文件

在本书前20章中可以看到,很多Java代码都已经编写好了,因此你的工作也得以大大简化。在Java类库内,你可以采用Swing类来进行用户界面编程,采用java.io类来进行文件的访问,采用java.awt.event来接受用户输入,你还可以使用其他类。通过使用这些类,你的编码负担大大降低,只需编写必要的代码即可。

需要学习的一种重要的 Java 编程技能是,找到可在项目中使用的 Java 类和包。重用开发好的类库要比从头编写自己的类简单得多。

Oracle 并非唯一一家开发大量 Java 类的开发商,读者在本章后面使用 XML 对象模型(XOM)时将看到,计算机程序员兼图书作者 Elliotte Rusty Harold 也开发了一个类库。Harold是Java语言和XML方面的专家,对现有XML类库的工作原理感到失望(读者可能明白了这里的含义,Java 本身是因 James Gosling 对另一种语言感到失望而开发的)。

Harold创建了自己的类库,用树结构表示XML数据,并将每个元素作为节点。

你可以从www.xom.nu上下载这个类库。

在你的计算机的某个文件夹中解压这个文件包,我使用是 Windows XP 系统,使用的文件夹是C:\\java\\XOM,这将顶层文件夹C:\\java指定为我所使用的Java库。在下载并解压该类库之后,必须将它添加到NetBeans中的当前项目中。

1. 选择 File->Project Properties,打开 Project Properties对话框。

2. 在Categories面板中单击Libraries,然后单击Add Library按钮,打开Add Library对话框。

3. 单击 Create按钮,打开 Create New Library 对话框。

4. 在Library Name文本框中输入XOM,然后单击OK按钮,打开Customize Library对话框。

5. 单击 Add JAR/Folder,打开 Browser JAR/Folder 对话框。

6. 找到存储XOM文件夹,然后选择xom-1.2.1和xom-samples文件(XOM的版本号可能不同),然后单击 Add JAR/Folder。

7. 在 Customize Library对话框中,单击 OK 按钮。

8. 在 Add Library对话框中选择 XOM,然后单击 Add Library。

9. 在 Project Properties对话框中,单击 OK。

现在,XOM库可在你的项目中使用了。

XOM包含可用于读写XML数据并将其存储到文件或其他目的地的类。

警告:

XOM 以开源许可 GNU LGPL(Lesser General Public License,更严格的通用公共许可)方式免费提供。你可以在不修改依附于XOM库的Java应用程序的前提下,分发XOM库。

你当然也可以对这个库中的类进行修改,但必须以LGPL方式提供修改后的库。有关这种许可的更详细信息,请访问www.xom.nu/license.xhtml。

接下来创建应用程序WeatherStation,它能够读取Weather Underground网站(www.wunderg round.com)以XML方言形式提供的天气信息。

注意:

网站地址htp://tinyurl.com/rd4r72是一个可以重定向到Weather Underground站点实际地址的简短 URL。Weather Underground 的实际地址很长,因此难以正确输入。它的一个完整地址如下所示:

http://wunderground.com/auto/wui/geo/ForecastXML/index.xml?query=W awsilla,AK

上述地址可以显示Wasilla,Alaska的天气预报信息。

XOM类库中的核心类位于nu.xom包中,要在程序中使用这些类,可使用下面的import语句:

Builder类能够加载并分析使用任何方言的XML数据,只要它是格式良好的。

下面的代码创建一个Builder对象并使用它加载天气文件:

XOM也可以加载Web上的XMl数据。不过它调用的build()方法是将数据所在的网络地址作为参数,如下面的代码所示:

当builder对象加载XML数据时,以Document对象的方式提供它,该对象存储了整个XML文档。

要检索文档的根元素,可使用 Document 对象的getRootElement( )方法:

Element类表示单个元素,可使用Element类的多个方法来查看元素的内容:

方法 getFirstChildElement( )提取与指定名称相同的第一个子元素;

方法 get( int)读取与指定索引(从 0 开始编号)匹配的元素;

方法 getChildElements( )提取所有的子元素;

方法 getValue( )读取元素的文本;

方法 getAttribute( )检索元素的一个属性。

下面的语句检索comment元素及其值:

在多个元素的名称相同时(如forecastday元素),这种方法将不管用。对于这样的元素,可检索所有的元素并使用for循环遍历它们:

该程序没有使用属性,但是可使用方法 getAttribute( )来访问元素的属性,该方法将属性名作为参数:

有了属性后,就可以使用其 getValue( )方法来获取其对应的值:

创建一个名为WeatherStation的Java空文件,然后输入程序清单21.3中的所有文本。

程序清单 21.3 WeatherStation.java 的源代码

应用程序WeatherStation不需要命令行参数,它将生成Wasilla,Alaska的6个天气预报,如下面的输出所示:

Output

注意:

Java类库包含用于 XML处理的 Java API(JAXP),该类与 XOM 的目的相同。JAXP可将XML数据表示为对象或事件流,这可以让程序员更好地控制数据的分析方式。XOM更容易学习,但是它在任何时候都需要格式正确而且有效的XML。有关JAXP的详情,将访问http://jaxp.java.net。

21.3 读取 RSS 聚合内容(Syndication Feeds)

有数百种XML方言,以独立于平台和软件的方式表示数据。其中最流行的一种是RSS,它是一种用于共享新闻摘要和链接的格式,这些信息摘要和链接来自在线新闻网站、博客和其他信息源。

RSS使得能够以XML格式提供Web内容,非常适合以通过网络能够访问的文件(被称为feed)方式提供。RSS阅读器,又称为新闻聚合器,已被数以百万计的信息搜集者用于跟踪最喜欢的网站。还有搜集和共享RSS内容的Web应用程序。

nu.xom包中的Builder类可通过Internet从任何URL加载XML:

这里将使用这种技术来读取一个RSS文件,并显示最新的15个条目。

在NetBeans中创建一个名为Aggregator的Java空文件,然后输入程序清单21.4中的所有文本,并保存。

程序清单 21.4 Aggregator.java 的源代码

在运行该应用程序之前,将命令行参数设置为你喜欢阅读的 feed,它可以是任何 RSS feed。如果你对此不了解,可以使用 http://feeds.drudge.com/retort,它包含来自 Drudge Retort (一个在线新闻网站)的新闻标题。

运行该应用程序后,读取自该feed的输出如图21.1所示。

图21.1 运行 Aggregator应用程序

21.4 总结

Java语言让软件能够独立于操作系统。在Windows中,使用该语言编写的程序经编译后生成的类文件,可在 Linux 服务器或Mac OS X计算机上运行。

XML给软件生成的数据带来了类似的解放。如果XML数据遵循了使其成为格式良好的规则,将可以使用任何分析XML的软件读取它,而不必使用创建它的程序。

XML对象模型(XOM)库使得读写XML数据更加容易。

当你使用Java和XML编程之后,就可以宣称自己不依赖于计算机程序员几十年来一直面临的两个障碍:陈旧的数据和操作系统。

21.5 问与答

问:在应用程序PropertyFileCreator生成的XML文件中,DOCTYPE语句有什么作用?

答:这是对一种文档类型定义(DTD)的引用,DTD是一个文件,定义了要使XML数据有效而必须遵循的规则。

如果打开该语句引用的网页 http://java.sun.com/dtd/properties.dtd,将看到有关 Java 库中的Properties类生成的XML文件中每个元素和属性的说明。

虽然Sun公司提供了该DTD,但Java官方文档指出,不应依赖它来分析属性配置数据。分析器将忽略它。

21.6 测验

请回答以下问题,以测试对XML的理解程度。

21.6.1 问题

1.下面哪个术语不应用来描述被正确格式化的XML数据?

a.格式良好。

b.有效。

c.dy-no-mite。

2.哪个方法读取父元素的所有子元素?

a.get( )。

b.getChildElements( )。

c.getFirstChildElement( )。

3.Elements类的哪个方法用于确定它包含的子元素数?

a.count( )。

b.length( )。

c.size( )。

21.6.2 答案

1.c.格式良好的数据正确组织了起始标记和结束标记,使用单个根元素包含所有的子元素,开头有?XML声明。有效的数据遵循了特定XML方言的规则。Dy-no-mite是喜剧演员 Jimmie J.J Walker 的口头禅。

2.b.方法getChildElements( )返回一个 Elements 对象,其中包含所有的子元素。

3.c.和 Vector 一样,Elements 也使用 size( )方法来确定其包含的子元素数。

21.7 练习

为拓展读者有关可扩展标记语言的知识,请完成下面的练习:

修改 WeatherStaton 应用程序,使其显示一个来自 Weather Underground 预报数据中的附加元素。

编写一个程序,它显示shortChanges.xml包含的数据,这是一个包含博客信息的XML文当,网址为www.weblogs.com/shortChanges.xml。

有关为完成这些练习而编写的Java程序,请访问本书的配套网站www.java24hours.com。

没有精选讨论主题。

全部讨论主题 查看精选主题

没有讨论主题。
😃 😅 😆 😁 😂 😊 😄 😠 😩 😲 😞 😵 😰 😒 😍 😤 😜 😝 😋 😘 😚 😷 😳 😢 😭 😨 😣 😡 😌 😖 😔 😱 😪 😏 😓 😥 😫 😉 👊 👍 👆 👇 👈 👉 👋 👏 👌 👎 👐 💓 💔 💕 💖 💗 💘 💙 💚 💛 💜 💝 💞 💟