求软件大神帮忙做个提取xml字段的java小程序实例

求大神帮忙解答一下这个XML程序是干什么用的,详解,急求_百度知道
求大神帮忙解答一下这个XML程序是干什么用的,详解,急求
由于字符太多我上传不到,只有上传到QQ邮箱的文件中专站里,求达人帮帮忙。账号密码都是这个jicky1234
我想知道此程序具体实现什么,怎么实现的
方便对方解析,要求封装格式一致,例如网站之间要通过接口传输某些数据。。XML是数据的一种格式。怎么说呢,这个时候用XML就比较好~一般XML有固定写法的
其他类似问题
您可能关注的推广回答者:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁oneMscomBlade,oneMsomNav,oneMscomFooter,
This site in other countries/regions:基于XML的文档管理系统_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
&&¥1.00
喜欢此文档的还喜欢
基于XML的文档管理系统
介​绍​基​于​X​M​L​的​文​档​管​理​系​统
阅读已结束,如果下载本文需要使用
想免费下载本文?
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢本教程的目标读者是使用XML并希望了解原生XML数据库(本教程中为 IBM& DB2& Express-C 9.5)的PHP和Java开发人员。虽然对PHP和Java编程有所了解很有帮助,但是不熟悉这些技术不影响阅读本教程。熟悉XMLDOM 也很有帮助。
关于本教程
本教程说明了如何利用原生XML数据库压缩开发周期。作为示例,我们将修改XML模式并观察代码中的相应变化。开发人员将了解到在PHP和Java技术中使用原生XML数据库所必须掌握的基本知识,包括:
连接到数据库(DB2 Express-C 9.5)
存储和检索XML数据
创建表单向数据库写入新的数据
创建表单从数据库读取已有的数据
使用 SQL/XML 查询数据库
增强数据视图支持快速查询功能
修改数据库模式
避免修改数据库
为了学习和掌握上述概念,我们将创建几个 Web 应用程序,PHP 代码部分让用户输入和查看患者数据,Java 代码部分则输入和查看医生的信息。
除了文本编辑器和浏览器之外,还需要支持Java和PHP服务器的必要工具:
Java JDK,从 Sun 下载最新的 JDK 运行和编译Java代码。本教程采用了Java6,升级包 5。
Apache Tomcat,作为托管Java应用程序的 Web 服务器。本教程使用 6.0.16 版。
PHP,最新版本的PHP,撰写本文的时候为 5.2.5。
Apache2,建议使用 Apache2 作为PHP的 HTTP 服务器。
操作系统不限。本教程是在运行 Windows Vista& Ultimate 的机器上编写的。
DB2 Express-C 9.5,本教程使用的数据库。可使用任何原生XML数据库如 Apache Xindice。
这一节介绍什么是原生XML数据库及其对开发的影响。还将介绍 DB2 Express-C 9.5 的主要特性,并提供快速安装指南。
为什么使用原生XML数据库?
只要用过一次原生XML数据库,您就再也不会放弃了。特别是如果您曾经从XML中分解所有的数据并塞入非XML数据库,然后检索数据重新组成原来的XML文件。或者,某个项目您已经完成了 90%,仅仅由于发现需要增加一个新的字段(或者修改模式),这个不幸的事故意味着您必须深入到数据库创建新的字段。然后再遍历所有的 SQL 字符串插入新字段,甚至没有时间关注代码是否需要进行必要的修改。如果使用原生XML数据库,需要改变数据库模式的时候,惟一需要关注的就是修改代码(不需要改动数据库或者 SQL 字符串)!
由此可见,原生XML数据库在节约开发时间和开发成本方面有很大的优势。本教程中,通过输入和查看患者信息的PHP应用程序以及输入和查看医生信息的Java应用程序这两个例子,您将体会到这种节约。
如前所述,任何原生XML数据库都适合本教程中的例子。不过我选择的是 DB2 Express-C 9.5,因此下面介绍如何快速安装 Express-C 以便开始编写代码。
DB2 Express-C 9.5快速安装指南
虽然 DB2 Express-C 9.5 的安装非常简单直接,但是下面的简要说明,包括几张图片可以帮助您完成安装。首先打开安装程序,然后在左侧的导航栏中选择 Install a Product,如图 1 所示。
图 1. 安装产品
单击 Install New,在欢迎屏幕中点击 Next。
接受许可协议并单击 Next。
选择 Custom 安装,然后单击 Next,如图 2 所示。
图 2. 安装方式
接下来选择 Install IBM DB2 Express Edition on this computer 并单击 Next。
在 Select features to install 窗口中选择合适的安装位置并单击 Next,如图 3 所示。
图 3. 要安装的特性
接下来选择语言并单击 Next。
保留默认的 DB2 副本名称(DB2COPY1)并单击 Next。
在 Specify the location of the DB2 information center 屏幕上选择 On the IBM Web site 并单击 Next,如图 4 所示。
图 4. DB2 Information Center
Set user information for the DB2 Administration Server 页面非常重要。选择 Local user,在 User name 字段中输入 Windows 用户名并输入用于登录 Windows 帐户的密码。一定要选中 Use the same user name and password for the remaining DB2 services 复选框,然后单击 Next,如图 5 所示。
图 5. 管理员用户信息
下一屏中单击 Configure。弹出较小的对话框时选择 Startup 选项卡,选择 Do not autostart the instance 然后单击 OK。
现在单击 Next 并选中 Prepare the DB2 tools catalog。这样可以使用 Task Center 调度高优先级的任务。其他保留默认值并单击 Next,如图 6 所示。
图 6. DB2 工具目录
在 Set up notifications 页面中保留 Set up your DB2 server to send notifications 未选中状态。但是如果需要可以输入有效的、不需要身份验证的 SMTP 服务器,从而使 DB2 能够在需要修复数据库的时候向管理员发送电子邮件。单击 Next。
下一屏中启用操作系统安全,选中 Enable operating system security。但对于本教程来说可以不选,然后单击 Next,如图 7 所示。
图 7. 操作系统安全
接下来显示的是安装开始前的提示页面。单击 Install 把 DB2 安装到机器上。完成后将看到 Setup is complete 页面,如图 8 所示。
图 8. 安装完成
这样安装就完成了!接下来我们将分别使用PHP和Java代码建立数据库连接。
建立数据库连接
DB2 已经就绪可以保存XML数据了,我们可以建立数据库然后使用PHP和Java代码连接到数据库。
建立测试数据库
本教程需要建立两个数据库,分别用PHP和Java开发。
但首先要保证必须以管理员身份(Windows Vista)启动了 db2systray.exe。因此要右键单击 /BIN/db2systray.exe(我的机器上是 C:Program FilesIBMSQLLIBBINdb2systray.exe)中的 db2systray.exe 图标并选择 Run as administrator。换句话说,系统工具栏中的图标用处不大。以管理员身份运行 DB2 系统工具条应用程序后就可以启动或者关闭 DB2 或者执行其他数据库相关操作了。
现在选择 DB2 系统工具条图标并单击 DB2 Control Center(如图 9 所示)。
图 9. 打开 DB2 Control Center
控制中心将显示在单独的窗口中,如图 10 所示。
图 10. DB2 Control Center
创建数据库需要右键单击 All Databases 文件夹,然后选择 Create Database > Standard,如图 11 所示。
图 11. 建立数据库
在 Specify a name for your new database 屏中的 Database name 字段中输入希望建立的数据库名称 PHPTEST(如图 12 所示)并单击 Finish。
图 12. 建立 PHPTEST 数据库
建立 PHPTEST 数据库之后,按照同样的方式创建另一个数据库 JAVATEST。
这样就行了!现在我们使用PHP和Java代码连接到 DB2 数据库。
使用PHP连接到 DB2:设置
编写PHP代码之前,需要用 IBM_DB2 模块配置PHP。
单击系统工具条中的里程表(speedometer)。然后单击PHPSettings >PHPextensions 并在列表中选择PHP_ibm_db2,如图 13 所示。
图 13. 用 IBM_DB2 模块配置PHP
重新启动 Apache2 就可以连接到 PHPTEST 数据库了!
使用PHP连接到 DB2:编写应用程序
现在编写一小段脚本检查是否能连接到 PHPTEST 数据库。创建文件 phptest.php 并保存到文档根目录下(我的机器上为 c:www)。编写代码,如清单 1 所示。
清单 1. 连接到 PHPTEST
$conn = db2_connect('PHPTEST',
if ($conn) {
echo "Connection successful";
db2_close($conn);
echo "Connection failed.n";
这段简单的代码仅仅使用前面安装部分所创建的用户名和密码连接到 PHPTEST 数据库。如果将其拖到浏览器(http://localhost/phptest.php)中将看到类似图 14 的结果。
图 14. 在浏览器中测试
下一节就要存储和检索XML了!
使用Java连接到DB2:设置
为了在Java环境下连接到数据库,首先需要设置 servlet 环境并复制连接 DB2 需要的几个 JAR 文件。首先在 Tomcat webapps 目录(/webapps/)下建立一个新目录 javadb2。在该目录下创建目录 WEB-INF。在 WEB-INF 中再建立两个目录:lib 和 classes。将下列 DB2 jar 文件从 /java(我的机器上为 C:Program FilesIBMSQLLIBjava)复制到 javadb2/WEB-INF/lib。
db2jcc.jar
db2jcc_license_cu.jar
清单 2 显示了最终的目录结构。
清单 2. 项目目录结构
/webapps/javadb2/WEB-INF/
----------------------------------+ lib/db2jcc.jar
----------------------------------+ lib/db2jcc_license_cu.jar
----------------------------------+ classes
然后编写代码、编译和运行 servlet 以连接到 JAVATEST 数据库。
使用Java连接到 DB2:编写 servlet
现在可以编写连接到数据库的 servlet 了。在类目录中创建一个新文件 JavaTest.java,如清单 3 所示。
清单 3. 连接到 JAVATEST
importJava.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
importJava.sql.*;
public class JavaTest extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter ut = response.getWriter();
Connection conn =
Class.forName("com.ibm.db2.jcc.DB2Driver");
DriverManager.getConnection(
"jdbc:db2://localhost:50000/JAVATEST",
out.println("Connection successful");
} catch (Exception ex) {
out.println("Connection failed");
System.out.println("SQLException: " + ex.getMessage());
上述代码使用前面安装部分所述的用户名和密码连接到 JAVATEST 数据库。要编译该类,可在类目录下输入下列命令:
javac -cp libservlet-api.jar JavaTest.java
运行新建类的最后一步是创建一个 web.xml 文件。在 WEB-INF 目录下创建该文件,如清单 4 所示。
清单 4. 创建 web.xml 文件
<web-app xmlns="/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="/xml/ns/javaee
/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
这个文件声明了 servlet 并告诉Apache Tomcat在哪里寻找该类,同时也说明了在服务器上的位置。
如果在浏览器中打开(http://localhost:8080/javadb2/JavaTest),结果应该类似于图 15。
图 15. 在浏览器中测试
现在已经能够使用PHP和Java代码连接到 DB2 了。接下来讨论XML模式、XML 数据和表单。
存储和检索XML数据
我们已经建立了数据库并经过试验证明可以使用PHP和Java代码连接到数据库,现在进行下一步吧。这一节将把XML数据存储到 DB2 数据库然后检索出来,首先要设计患者和医生的XML模式。
设计XML模式
存储和检索XML之前首先要为患者和医生设计一个模式。
患者需要的数据元素包括:
姓名(fname 和 lname)
地址(街道、邮编、州)
清单 5 显示了一个XML示例文档。
清单 5. 患者XML文档
1280 N 1283 E
555.555.5555
医生需要下列数据元素:
姓名(fname 和 lname)
职务(Title)
专业(Specialty)
地址(街道、邮编、州)
传真号(Fax number)
清单 6 给出了医生的XML文档例子。
清单 6. 医生的XML文档
Doctor of Anesthetics
Anesthetics
1280 N 1283 E
555.555.5554
555.555.5553
使用PHP存储XML数据
有了模式和数据之后,我们来创建一个表并将XML直接存入该表。重写 phptest.php(如清单 7 所示)。
清单 7. 使用PHP存储XML数据
$conn = db2_connect('PHPTEST',
if (!$conn) {
echo "Connection failed";
$sql = 'DROP TABLE patients';
db2_exec($conn, $sql);
$sql = 'CREATE TABLE patients
(id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY
(START WITH 1 INCREMENT BY 1),
dataXML)';
db2_exec($conn, $sql);
$sql = "INSERT INTO patients (data) values ('
1280 N 1283 E
555.555.5555
db2_exec($conn, $sql);
db2_close($conn);
首先像前面那样连接到数据库。创建新表 patients,包括 ID 和数据表。然后在数据库中插入一条记录并关闭连接。
使用PHP检索XML数据
检索刚刚存储的XML。把清单 8 中代码添加到 phptest.php 中即可实现。
清单 8. 检索XML
db2_exec($conn, $sql);
$sql = "SELECT data FROM patients";
$stmt = db2_prepare($conn, $sql);
db2_execute($stmt);
while($result = db2_fetch_assoc($stmt)) {
echo str_replace('>', '>',
str_replace('<', '<', $result['DATA']));
db2_close($conn);
选择新建的患者表中的数据字段,遍历所有的结果并显示数据。
再次在浏览器中打开 phptest.php 将得到图 16 所示的结果。
图 16. 显示结果
然后建立两个 Web 表单来自动处理这些任务。
使用PHP创建Web表单
要创建的第一个表单将通过 Web 输入的表单数据转化成XML,然后存入数据库。编写新的PHP文件 form.php,如清单 9 所示。
清单 9. 输入新患者的 Web 表单
if($_POST['save'] != ''){
$conn = db2_connect('PHPTEST',
if (!$conn) {
echo "Connection failed";
$fname = $_POST['fname'];
$lname = $_POST['lname'];
$street = $_POST['street'];
$zip = $_POST['zip'];
$state = $_POST['state'];
$phone = $_POST['phone'];
$sql = "INSERT INTO patients (data) values ('
db2_exec($conn, $sql);
db2_close($conn);
First Name:
Last Name:
观察一下PHP文件结束部分的表单。简言之,它能够接收填充XML所需要的所有数据并保存到数据库中。表单如图 17 所示。
图 17. Web 患者表单
单击 Save 通过 POST 请求提交表单,代码连接到 PHPTEST 数据库,利用表单输入的数据填充XML,将XML保存到 DB2,关闭数据库连接并重新显示表单。
下面将创建表单以查看数据库中的患者信息并显示在屏幕上。
用PHP创建数据查看器
由于数据是作为XML存储的,需要在PHP中使用 DOM 以帮助提取XML并显示到浏览器中。编写一个新的PHP文件 viewer.php,如清单 10 所示。
清单 10. 提取和查看XML数据
$conn = db2_connect('PHPTEST',
if (!$conn) {
echo "Connection failed";
echo "First
NameLast Name".
"StreetZip
StatePhonen";
$sql = "SELECT data FROM patients";
$stmt = db2_prepare($conn, $sql);
db2_execute($stmt);
while($result = db2_fetch_assoc($stmt)) {
$doc = new DOMDocument();
$doc->loadXML($result['DATA']);
$fname = $doc->getElementsByTagName('fname')->item(0)->nodeV
$lname = $doc->getElementsByTagName('lname')->item(0)->nodeV
$street = $doc->getElementsByTagName('street')->item(0)->nodeV
$zip = $doc->getElementsByTagName('zip')->item(0)->nodeV
$state = $doc->getElementsByTagName('state')->item(0)->nodeV
$phone = $doc->getElementsByTagName('phone')->item(0)->nodeV
echo "$fname
$lname$street".
"$zip$state
db2_close($conn);
代码首先连接到 PHPTEST 数据库。从数据库检索全部数据记录并存储到 DOMDocument 供浏览器检索和显示。结果如图 18 所示。
图 18. 浏览器中显示的患者XML数据
使用Java存储XML数据
您的 PHPXML功能已经很发达了,现在展示一下XMLJava 的力量。首先重写 JavaTest.java 文件,在 JAVATEST 数据库中创建医生表,如清单 11 所示。
清单 11. 使用Java存储XML数据
importJava.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
importJava.sql.*;
public class JavaTest extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter ut = response.getWriter();
Connection conn =
Class.forName("com.ibm.db2.jcc.DB2Driver");
DriverManager.getConnection
("jdbc:db2://localhost:50000/JAVATEST",
} catch (Exception ex) {
out.println("Connection failed");
System.out.println("SQLException: " + ex.getMessage());
sql = "DROP TABLE doctors";
stmt = conn.createStatement();
stmt.execute(sql);
} catch (Exception ex) {
System.out.println("doctors table doesn't exist");
stmt = conn.createStatement();
sql = "CREATE TABLE doctors
(id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY
(START WITH 1 INCREMENT BY 1),
dataXML)";
stmt.execute(sql);
sql = "INSERT INTO doctors (data) values ('n"+
" Smithn"+
" Doctor of Anestheticsn"+
" Anestheticsn"+
" 1280 N 1283 En"+
" 99999n"+
" 555.555.5554n"+
" 555.555.5553n"+
stmt.executeUpdate(sql);
和前面一样,先建立数据库连接,如果已经存在则删除数据库(仅用于测试)。然后创建 doctors 表。请注意,创建的方法和患者表一样,只不过存储的医生信息采用完全不同的模式。创建表后添加XML示例数据。
然后检索刚刚输入的信息并在浏览器中显示。
使用Java检索XML数据
XML 示例数据已经存在,可以检索并在浏览器中显示了。按照清单 12 更新 JavaTest.java 文件。
清单 12. 使用Java检索XML数据
stmt.executeUpdate(sql);
sql = "SELECT data FROM doctors";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
String str = rs.getString(1);
str = replaceAll(str, "<", "<");
str = replaceAll(str, ">", ">");
out.println(str);
} catch (Exception ex) {
System.out.println("SQLException: " + ex.getMessage());
public static String replaceAll(String source,
String toReplace,
String replacement){
int idx = source.lastIndexOf(toReplace);
if(idx != -1) {
StringBuffer ret = new StringBuffer(source);
ret.replace(idx, idx+toReplace.length(), replacement);
while((idx=source.lastIndexOf(toReplace, idx-1)) != -1) {
ret.replace(idx, idx+toReplace.length(), replacement);
source = ret.toString();
上述代码查询数据库并检索全部XML记录,格式化数据然后显示在浏览器中。请注意其中的帮助器函数,它用于把尖括号()替换为适当的 HTML 代码以便查看。重写后的 JavaTest 类的输出结果如图 19 所示。
图 19. 从数据库检索XML数据
下面创建一个 Web 表单以使用 Web 应用程序输入新的医生信息。
使用Java代码创建 Web 表单
这一节和 下一节 创建了两个新的 servlet 来处理医生表单和查看器。首先对 web.xml 文件略加修改,如清单 13 所示。
清单 13. 修改 web.xml 文件
web.xml 文件中仅仅增加了 Form. 和 Viewer servlet,和前面的 JavaTest servlet 一样。
现在完成 Web 表单和输入医生信息。在类目录中编写新文件 Form.java,如清单 14 所示。
清单 14. 输入医生信息的Java表单
importJava.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
importJava.sql.*;
public class Form. extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter ut = response.getWriter();
out.println(
"First Name: n"+
"Last Name: n"+
"Suffix: n"+
"Title: n"+
"Specialty: n"+
"Street: n"+
"State: n"+
"Phone: n"+
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter ut = response.getWriter();
Connection conn =
Class.forName("com.ibm.db2.jcc.DB2Driver");
DriverManager.getConnection
("jdbc:db2://localhost:50000/JAVATEST",
} catch (Exception ex) {
out.println("Connection failed");
System.out.println("SQLException: " + ex.getMessage());
String fname = request.getParameter("fname");
String lname = request.getParameter("lname");
String suffix = request.getParameter("suffix");
String title = request.getParameter("title");
String specialty = request.getParameter("specialty");
String street = request.getParameter("street");
String zip = request.getParameter("zip");
String state = request.getParameter("state");
String phone = request.getParameter("phone");
String fax = request.getParameter("fax");
String sql = "INSERT INTO doctors (data) values ('n"+
" "+fname+"n"+
" "+lname+"n"+
" "+suffix+"n"+
" "+title+"n"+
" "+specialty+"n"+
" "+street+"n"+
" "+zip+"n"+
" "+state+"n"+
" "+phone+"n"+
" "+fax+"n"+
Statement stmt = conn.createStatement();
stmt.executeUpdate(sql);
} catch (Exception ex) {
System.out.println("SQLException: " + ex.getMessage());
out.println(
String sql = "INSERT INTO doctors (data) values ('n"+
" "+fname+"n"+
" "+lname+"n"+
" "+suffix+"n"+
" "+title+"n"+
" "+specialty+"n"+
" "+street+"n"+
" "+zip+"n"+
" "+state+"n"+
" "+phone+"n"+
" "+fax+"n"+
Statement stmt = conn.createStatement();
stmt.executeUpdate(sql);
"First Name: n"+
"Last Name: n"+
"Suffix: n"+
"Title: n"+
"Specialty: n"+
"Street: n"+
"State: n"+
"Phone: n"+
其中包括 doGet 和 doPost 方法。doGet 方法处理 GET 请求并返回表单,如图 20 所示。
图 20. Web 医生表单
如果单击 Save 按钮,信息就会转移到处理 POST 请求的 doPost 方法。和 清单 14 一样,建立了数据库连接。然后获取通过 POST 请求传递的所有数据并存储到变量中。然后用XML创建插入语句,变量插入到XML适当的位置。成功插入后,输出表单以便添加新的记录。
使用Java建立数据查看器
向数据库添加医生之后,还需要一个Javaservlet 从数据库提取XML数据以显示到浏览器中。新建Java文件 Viewer.java,如清单 15 所示。
清单 15.Java数据查看器
importJava.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
importJava.sql.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import javax.xml.parsers.*;
public class Viewer extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter ut = response.getWriter();
Connection conn =
Class.forName("com.ibm.db2.jcc.DB2Driver");
DriverManager.getConnection
("jdbc:db2://localhost:50000/JAVATEST",
} catch (Exception ex) {
out.println("Connection failed");
System.out.println("SQLException: " + ex.getMessage());
out.println("
First Name"+
"Last Name
SuffixTitle"+
"Specialty
StreetZip"+
PhoneFax");
String sql = "SELECT data FROM doctors";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
DocumentBuilderFactory factory =
DocumentBuilder builder =
Document doc =
while(rs.next()){
String str = rs.getString(1);
factory = DocumentBuilderFactory.newInstance();
builder = factory.newDocumentBuilder();
doc = builder.parse(new InputSource
(new StringReader(str)));
String fname = doc.getElementsByTagName("fname")
.item(0).getFirstChild().getNodeValue();
String lname = doc.getElementsByTagName("lname")
.item(0).getFirstChild().getNodeValue();
String suffix = doc.getElementsByTagName("suffix")
.item(0).getFirstChild().getNodeValue();
String title = doc.getElementsByTagName("title")
.item(0).getFirstChild().getNodeValue();
String specialty = doc.getElementsByTagName("specialty")
.item(0).getFirstChild().getNodeValue();
String street = doc.getElementsByTagName("street")
.item(0).getFirstChild().getNodeValue();
String zip = doc.getElementsByTagName("zip")
.item(0).getFirstChild().getNodeValue();
String state = doc.getElementsByTagName("state")
.item(0).getFirstChild().getNodeValue();
String phone = doc.getElementsByTagName("phone")
.item(0).getFirstChild().getNodeValue();
String fax = doc.getElementsByTagName("fax")
.item(0).getFirstChild().getNodeValue();
out.println(""+fname+"
"+lname+""+
""+suffix+"
"+title+""+
""+specialty+"
"+street+""+
"+state+""+
""+phone+"
"+fax+"n");
} catch (Exception ex) {
System.out.println("SQLException: " + ex.getMessage());
out.println("");
该 servlet 仅支持 GET 请求,因此没有 doPost 方法。首先建立数据库连接,然后创建显示提取的全部XML数据的表格头部。查询数据库,检索全部的医生XML记录并逐个显示到浏览器。这里使用 DOM 解析XML,检索填充表格的信息。
正确输出数据后,结果如图 21 所示。
图 21. 在浏览器中查看医生XML数据
现在您已经非常熟悉如何在PHP和Java中使用XML数据库。但是请稍等,最好的总是放在最后:在查询中使用 SQL/XML!
执行 SQL/XML 查询
现在已经建立了PHP和Java编写的功能完整的 Web 表单和查看器,分别用于输入患者和医生的信息。现在我们对查看器进一步改进,增加一个快速搜索表单让用户输入数据。代码根据输入的数据创建 SQL/XML 语句,查询存储在数据库中的XML中的元素。
使用PHP执行 SQL/XML 查询
SQL/XML 查询可以查询数据库中的XML而不需要手工解析XML。修改 viewer.php 文件,如清单 16 所示。
清单 16. 使用 SQL/XML 查询数据库
echo "Connection failed";
$query = 1;
if($_POST['search'] != ''){
if($_POST['zip'] != '')
$query .= ' and $i/address/zip="'.$_POST['zip'].'"';
if($_POST['lname'] != '')
$query .= ' and $i/name/lname="'.$_POST['lname'].'"';
if($_POST['state'] != '')
$query .= ' and $i/address/state="'.$_POST['state'].'"';
Quick Search:
Last Name:
First NameLast Name".
"StreetZip
StatePhonen";
$sql = 'SELECT
XMLQUERY('
for $i in $x/patient
where '.$query.'
return $i'
passing DATA as "x") as DATA
FROM patients';
$stmt = db2_prepare($conn, $sql);
db2_execute($stmt);
请注意新的变量 $query,它的默认值设为 1。此外还有 $sql 变量中的 SQL 语句组。因为 $query 默认值为 1,这种情况下查询为真,XML 数据在浏览器中显示。下面看看 Quick Search 表单。如图 22 所示。
图 22.PHP患者快速搜索表单
这里允许用户根据五个字段中的三个查询。通过上面的表单可看到 if 语句中的 $query 变量(参见 清单 16)是如何填充的。如果在文本框中输入一个值,则XML必须等于文本框中输入的数据。清单 17 显示了上面输入的 SQL/XML。
清单 17. 患者数据的 SQL/XML 语句
SELECT DATA
FROM patients where
XMLEXISTS('
for $i in $x/patient
where 1 and
$i/address/zip="99999" and
$i/address/state="MO"
return $i'
passing DATA as "x")
因此只有名为 Joe Smith(MO 州,邮编 99999)的患者显示到浏览器中,如 图 22 所示。
使用Java执行 SQL/XML 查询
医生快速搜索表单可以查找称谓、专业和州的XML字段。修改 Viewer.java 将上述功能结合到医生数据查看器中,如清单 18 所示。
清单 18. 改进后的Java医生数据查看器
System.out.println("SQLException: " + ex.getMessage());
out.println("Quick Search:"+
"Suffix: "+
"Specialty: "+
"State: "+
"<input type="submit" name="search""+
" value="Search"/>"+
out.println("
First Name"+
"Last Name
SuffixTitle"+
"Specialty
StreetZip"+
PhoneFax");
String query = "1";
if(request.getParameter("search") != null){
String suffix = request.getParameter("suffix");
String specialty = request.getParameter("specialty");
String state = request.getParameter("state");
if(suffix != "")
query += " and $i/suffix=""+suffix+""";
if(specialty != "")
query += " and $i/specialty=""+specialty+""";
if(state != "")
query += " and $i/address/state=""+state+""";
String sql = "SELECT DATA "+
"FROM doctors where XMLEXISTS("+
"'for $i in $x/doctor "+
"where "+query+" "+
"return $i' "+
"passing DATA as "x")";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
和PHP患者数据查看器的原理类似,表单也显示出来,默认查询为 1。还要注意,当用户选择搜索按钮的时候也需要 doPost 方法,但是没有任何操作而是直接调用 doGet 方法。因此如果用户单击搜索按钮(非空),查询字符串根据条件确定要显示的XML文档。查询字符串已经准备好并合并到最后的 SQL/XML 字符串中,执行情况类似,只有匹配的数据显示在浏览器中。表单如图 23 所示。
图 23.Java医生快速搜索表单
清单 19 显示对应的 SQL/XML 字符串。
清单 19. 医生数据的 SQL/XML 语句
SELECT DATA
FROM doctors where
XMLEXISTS('
for $i in $x/doctor
where 1 and
$i/specialty="Anesthetics" and
$i/address/state="MO"
return $i'
passing DATA as "x")
这样就和其他关系数据库一样,可以筛选和查询XML数据了。
假设发现缺少了应用程序需要的一个字段,比如 ID、出生日期或者电子邮件地址,该怎么办呢?需要修改多少代码?要知道数据库和 SQL 字符串不受影响。这一节我们通过对两个模式稍加修改来证明这一点。
改变模式可以评估代码修改的代价。按照清单 20 修改患者模式。
清单 20. 修改患者模式
555.555.5555
12/15/1969
只不过增加了一个出生日期字段。对于医生模式,我们去掉职务字段,如清单 21 所示。
清单 21. 从医生模式去掉一个字段
Anesthetics
结果如何?数据库毫无影响,因为它直接接受XML。因此事实上,惟一需要修改的就是数据输入表单和查看器表单中的可见字段。首先修改PHP表单,然后再看看Java表单。
PHP 表单需要做的修改
患者模式增加了一个新字段。清单 22 显示了 form.php 需要做的修改。
清单 22. 修改 form.php
$state = $_POST['state'];
$phone = $_POST['phone'];
$birthdate = $_POST['birthdate'];
$sql = "INSERT INTO patients (data) values ('
$birthdate
Birth date:
只需要在表单中增加一个字段,在 POST 请求中捕获数据并填充到XML中。数据库没有任何修改。新表单如图 24 所示。
图 24. 修改后的患者表单
接下来修改PHP患者数据查看器。
PHP 数据查看器需要做的修改
PHP 数据查看器的改动也很小。现在查看器需要增加一列,从XML检索新的字段并显示在对应的行中。修改的情况如清单 23 所示。
清单 23. 修改PHP患者数据查看器
"StreetZip
StatePhone".
"Birth daten";
$sql = 'SELECT DATA
FROM patients where
$phone = $doc->getElementsByTagName('phone')->item(0)->nodeV
$birthdate = $doc->getElementsByTagName('birthdate')->item(0)->nodeV
echo "$fname
$lname$street".
$state$phone".
"$birthdaten";
修改后的效果如图 25 所示。
图 25. 修改后的患者查看器
请注意原来的数据没有出生日期,没有关系。可以建立一个编辑器来修改空白字段,然后重新填充XML并存储到数据库(类似于一般的更新语句)。更多信息请参阅 参考资料 中的链接。
现在来修改Java表单。
Java 表单需要做的修改
这一次没有增加字段,而是取消了医生的职务字段。从XML删除字段和前面 PHPXML增加字段相比甚至更简单。变动见清单 24(Form.java)。
清单 24. 修改 Form.java
"Last Name: n"+
"Suffix: n"+
"Specialty: n"+
"Street: n"+
String lname = request.getParameter("lname");
String suffix = request.getParameter("suffix");
String specialty = request.getParameter("specialty");
String street = request.getParameter("street");
" "+suffix+"n"+
" "+specialty+"n"+
"Last Name: n"+
"Suffix: n"+
"Specialty: n"+
"Street: n"+
实际上只不过删除了一行代码,不多也不少。输入数据的新表单如图 26 所示。
图 26. 修改后的Java医生表单
惟一的区别就是没有了 Title 字段。简单吧?下面我们修改Java医生数据查看器表单。
Java 数据查看器需要做的修改
医生XML少了一个字段,查看器只需要减少一个显示字段。因此删除了 Viewer.java 中的三行,如清单 25 所示。
清单 25. 修改 Viewer.java
out.println("First Name"+
"Last NameSuffix"+
"SpecialtyStreet
String lname = doc.getElementsByTagName("lname")
.item(0).getFirstChild().getNodeValue();
String suffix = doc.getElementsByTagName("suffix")
.item(0).getFirstChild().getNodeValue();
String specialty = doc.getElementsByTagName("specialty")
.item(0).getFirstChild().getNodeValue();
String street = doc.getElementsByTagName("street")
.item(0).getFirstChild().getNodeValue();
out.println(""+fname+"
"+lname+""+
""+suffix+""+
""+specialty+"
"+street+""+
删除这三行后,浏览器中就不再显示 Title 字段了,如图 27 所示。
图 27. 修改后的Java医生查看器
大功告成!使用XML增加和删除字段都非常简单。由此可见,使用原生XML数据库可以节省大量的时间!
本教程结束了,读者应该已经了解如何使用原生XML数据库了。您熟悉了 DB2 Express-C 9.5,它的功能以及非常出色的 Control Center。您掌握了如何编写使用原生XML数据库存储XML数据的PHP和Java应用程序,既能查看又能查询。最后,也许也是最重要的,您已经体会到对于 Web 应用程序开发来说,使用原生XML数据库是多么强大,多么省时省力。
声明:该文章系网友上传分享,此内容仅代表网友个人经验或观点,不代表本网站立场和观点;若未进行原创声明,则表明该文章系转载自互联网;若该文章内容涉嫌侵权,请及时向上学吧网站投诉>>
上一篇:下一篇:
相关经验教程
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益

我要回帖

更多关于 提取字段 的文章

 

随机推荐