给定如下XML文档:
现提出如下设计需求:
测试用户期望功能如下:
图14.1 功能用例建模
功能模块中的核心业务是:以"书号"作为搜索关键字,执行精确查询并返回XML文档片断。
核心业务流程描述如下:
图14.2 核心业务数据流
基于三层架构视角的文件包及文件设计如表14.1所述。
序号 | 包设计 | 文件设计 |
---|---|---|
1 | 设计表示层包(包名:UI),抽象表示层文件容器。 |
|
2 | 设计业务逻辑层包(包名:server),抽象业务层文件容器。 |
|
3 | 设计数据层包(包名:data),抽象数据层文件容器。 |
|
图14.3 文件包设计及文件关系
文件架构如图14.4所示。
图14.4 文件架构
文件功能说明见表14.1所述。
序号 | 文件(夹)名 | 作用 |
---|---|---|
1 | books.xml | 用于测试的XML基础数据 |
2 | Server.js | NodeJS后台服务通用逻辑 |
3 | jquery-1.11.1.js | 加载JQuery函数库 |
4 | main.html | 用户界面主页 |
5 | Data | 存放XML数据文件的文件夹 |
6 | server | 存放业务逻辑层文件的文件夹 |
7 | UI | 存放表示层文件的文件夹 |
8 | xmldom | 安装xmldom模块产生的文件夹 |
9 | xpath | 安装xpath模块产生的文件夹 |
10 | _doc | 存放辅助文档,不参与项目运行 |
11 | Server_14.js | 当前模块服务专用逻辑 |
主页文件main.html实现代码如下:
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<h2>基于XPath的标记数据精确查询测试</h2>
<hr />
请输入书号<input type="text" id="isbn_input" />
<input type="button" value="精确查询图书" onclick="select_TagData()" />
<input type="button" value="查看全部图书" onclick="view_all()" />
<hr />
<div id="outer_div">
</div>
</body>
</html>
<script type="text/javascript" src="jquery-1.11.1.js"></script>
<script type="text/javascript">
//基于XPath的标记数据精确查询
function select_TagData() {
var book_num = $("#isbn_input").val();
var xhttp = new XMLHttpRequest();
xhttp.open("post", "http://localhost:1017/exeXPath_14?param=" + encodeURIComponent(book_num), true);
xhttp.onreadystatechange = function () {
if (xhttp.status == 200 && xhttp.readyState == 4) {
$("#outer_div").html("<table border='1'>"+xhttp.responseText+"</table>");
}
}
xhttp.send();
}
//查看全部图书
function view_all() {
var xhttp = new XMLHttpRequest();
xhttp.open("post", "http://localhost:1017/viewAll_14", true);
xhttp.onreadystatechange = function () {
if (xhttp.status == 200 && xhttp.readyState == 4) {
$("#outer_div").html( xhttp.responseText);
}
}
xhttp.send();
}
</script>
1、通用服务实现
// JavaScript source code
//----------------请将这个文件保存为Unicode格式,否则麻烦大大的----------------
const http_obj = require("http");//用于产生服务对象
const fs_obj = require("fs");//读写后台文件
const url_tran_obj = require("url");//解释URL
const server = http_obj.createServer(function (request, response) {
//请求路径处理
var req_str = decodeURI(request.url);
var req_head;
var POS = req_str.indexOf("?");
if (POS == -1) { req_head = req_str; }
else { req_head = req_str.substring(0, POS); }
//设置查询对象
var url_obj = url_tran_obj.parse(req_str, true);
var Q_obj = url_obj.query;
//响应头设置
response.setHeader("Content-Type", "text/plain;charset=utf-8");
response.setHeader("Access-Control-Allow-Origin", "*");//实现跨域访问
response.writeHead(200);
//%%%%%%%%%%%%%----------------begin your code
//初始化所有服务对象
require("./14/server/server_14.js")(request, response, req_head, Q_obj, fs_obj);
//%%%%%%%%%%%%%----------------end your code
});
server.listen(1017);
console.log("Server is running at port 1017...");
2、专用服务实现
文件server_14.js代码:
function server_14(request, response, req_head, Q_obj, fs_obj) {
//执行XPath
if (req_head == "/exeXPath_14") {
var b_isbn = Q_obj["param"];
var b_xpath = "/table/tr[position()=1] | /table/tr[td[1]='" + b_isbn + "']";
var select = require("./xpath");//获取查询函数
var dom = require("./xmldom").DOMParser;//获取DOMParser类
fs_obj.readFile("./14/data/books.xml", "utf-8", function (err, data) {
if (err) { response.end(err); }
else {
var xmldom = new dom().parseFromString(data);
var nodes = select(xmldom, b_xpath);
if (nodes.length == 1) { response.end("未找到相关数据!"); }
else { response.end(nodes.toString()); }
}
});
}
//查看全部图书
if (req_head == "/viewAll_14") {
fs_obj.readFile("./14/data/books.xml", "utf-8", function (err, data) {
if (err) { response.end(err); }
else {
response.end(data);
}
});
}
}
module.exports = server_14
查看全部图书如图14.5所示。
图14.5 查看全部图书
精确查询如图14.6所示。
图14.6 精确查询示例
问题提出:实现基于XPath的标记数据精确查询的主技术要点是什么?
问题思考:
给定如下XML文档:
现提出如下设计需求: