XML五
1. XML数据库
1.1关系型数据库
- 基本概念:
– 关系:一张二维表,关系名即表名。
– 元组:二维表中的一行,记录。
– 属性:二维表中的一列,字段。
– 域:属性的取值范围. – 关键字:可以唯一标识元组的属性,主键
– 关系模式:表结构。 - 优点:
– 容易理解:二维表结构。
– 使用方便:通用的SQL语言使得操作关系型数据库非常方便。
– 易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大降低了数据冗余和数据不一致的概率
1.2XML文档类型
- 面向文档处理的XML文档
以复杂或无规则的结构和混合内容为特征
文档处理侧重于给用户提供信息的最终表示 - 面向数据处理的文档
特征是高度有序的结构,并且同时带有那些数据结构的多个副本
文档处理通常侧重于应用程序间的数据交换
1.3三种XML数据库
XML Enabled Database(XEDB) :在原有的数据库系统上扩充对XML数据的处理
Native XML Database(NXD):以自然的方式处理XML数据,以XML文档作为基本的逻辑存储单位,专门设计适用的数据模型和处理方法
Hybrid XML Database(HXD),即混合XML数据库
1.3.1XML Enabled Database(XEDB)
- 原理
– 把XML查询要求转换为数据库的查询表达,如SQL,由数据库的查询引擎优化查
询表达,产生查询执行计划并执行,最后再将查询的结果转换为XML数据。
– 一定程度上解决了查询复杂性的要求
– 多次转换带来效率的降低和查询语义的混淆,即阻抗失配的问题
– 一些现有的商业数据库管理系统(如SQL Server、 Oracle等)扩充了处理XML数据的功能。 - 优点
– 沿用原有传统数据库技术,只是稍加改变,就可以支持XML应用。
– 传统数据库技术很成熟 ,例如并发控制、事务等
– 传统数据库知识和经验依然有效,用户不需要为了应用XML而再去学习一套新的数据库技术 - 缺点
– XML文档和数据库之间的模式转换复杂,在前期开发阶段需要投入很大
– XML文档存入到数据库时需要将其"打碎",取出时需要"组合",不仅耗时,而且文档的格式可能会不同
– 对"以文档为中心"、格式复杂的XML文档处理性能较差
– 在采纳XML技术标准方面较落后
1.3.2Native XML Database(NXD)
- 原理
– 系统直接存储XML数据;
– 支持XML数据的自描述性、半结构化和有序性;
– 直接支持XML查询语言,如XQuery,XPath - 优点
– XML文档存取无需模式转换,存取速度快
– 对格式复杂的XML文档支持比XED要好
– 支持大部分的最新的XML技术标准 - 缺点
– 在传统数据库技术方面比较薄弱,没有经过时间的考验
– 知识比较新,相应的支持人员和文档资源都比较少
– 应用范围仅局限在XML应用领域中
1.4四个主流的Native-XML数据库
- Tamino数据库系统
- eXist数据库系统
- Xindice数据库
- Berkeley DB XML嵌入式数据库
2. 数据岛
- XML 数据岛(XML Data Islands)是嵌入 HTML 页面中的 XML 数据
- XML 数据岛只在 Internet Explorer 浏览器中有效
- 可以在 HTML 中使用 JavaScript 和 XML DOM 来解析并显示 XML,从而代替数据岛
2.1XML 数据岛的应用
把 XML 文档绑定到 HTML 文档中的一个 标签,id 属性定义数据岛的标识符,而 src 属性指向 XML 文件
<html>
<body>
<xml id="ac" src="12-2.xml"></xml>
<table border="1" datasrc="#ac"> <tr>
<td><span datafld="name"></span></td>
<td><span datafld="location"></span></td>
<td><span datafld="size"></span></td>
<td><span datafld="activity"></span></td>
</tr>
</table>
</body>
</html>
2.2行为机制(behaviors)
– Behaviors 是通过使用 CSS 样式向 XML (或 HTML )元素添加行为的一种方法
– 只有 Internet Explorer 支持 behavior 属性
– 可以使用 JavaScript 和 XML DOM (或 HTML DOM)来代替
<html>
<head>
<style type="text/css">
h1 { behavior: url(12-3.htc) }
</style>
</head>
<body>
<h1>Mouse over me!!!</h1>
</body>
</html>
<attach for="element" event="onmouseover" handler="hig_lite" />
<attach for="element" event="onmouseout" handler="low_lite" />
<script type="text/javascript">
function hig_lite(){
element.style.color='red';
}
function low_lite(){
element.style.color='blue';
}
</script>
2.3数据岛的好处
- 提供给客户结构化的数据视图
- 集成不同来源的结构化数据
- 通过粒度更新来提高性能
- 网页界面修改不易破坏数据
2.4将HTML元素和XML文档绑定
- 首先,并非每个HTML元素都能绑定
- 其次,并非每个HTML元素都能更新数据岛
- 第三,并非每个HTML元素都能将数据岛的节点文本呈现为HTML
- 可供绑定的HTML元素共分为两大类:
– 单值对象(Single-valued Consumer)
– 表对象(Tabular Consumer)
2.5支持DSO的HTML元素
2.6DSO和XSL切换样式
- 数据岛可以作为XML数据的容器
- 数据岛还可以作为XSL的容器
- 使用脚本将数据源对象与样式单相关联
3. JSON
- JavaScript Object Notation(JSON)
- 一种基于JavaScript语言的轻量级的数据交换格式
- JSON 是存储和交换文本信息的语法
- JSON 比 XML 更小、更快,更易解析
<script type="text/javascript">
function loadjson(){
var JSONObject= {
"name":"香鱼",
"location":"河流",
"size":"中偏小",
"activity":"00:00-23:59"};
document.getElementById("fname").innerHTML=JSONObject.name;
document.getElementById("flocation").innerHTML=JSONObject.location;
document.getElementById("fsize").innerHTML=JSONObject.size;
document.getElementById("factivity").innerHTML=JSONObject.activity;
}
</script>
3.1与XML相似之处
- JSON 是纯文本
- JSON 具有“自我描述性”(人类可读)
- JSON 具有层级结构(值中存在值)
- JSON 可通过 JavaScript 进行解析
- JSON 数据可使用 AJAX 进行传输
3.2与XML的不同之处
- 没有结束标签
- 更短
- 读写的速度更快
- 能够使用内建的 JavaScript eval() 方法进行解析
- 使用数组
- 不使用保留字
3.3JSON 语法
- 数据在键/值对中
- 数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
- JSON 数据的书写格式是:键/值对
例如:“surname” : “Zhao” - JSON 值
- – 数字(整数或浮点数)
– 字符串(在双引号中)
– 逻辑值(true 或 false)
– 数组(在方括号中)
– 对象(在花括号中)
– null - JSON 对象
– JSON 对象在花括号中编写
– 对象可以包含多个键/值对
– { “surname”:“Zhao” , “firstname”:“Chun” } - JSON 数组
– JSON 数组在方括号中编写
– 数组可包含多个对象
{"employees": [
{ "surname":"Zhao" , "firstname":"Chun" },
{ "surname":"Zhang" , "firstname":"San" },
{ "surname":"Li" , "firstname":"Si" }
]}
- JSON 文本转换为 JavaScript 对象
– eval() 函数使用的是 JavaScript 编译器,可解析 JSON 文本,并生成 JavaScript对象,例:
var text1='{"employees": [
{ "surname":"Zhao" , "firstname":"Chun" },
{ "surname":"Zhang" , "firstname":"San" },
{ "surname":"Li" , "firstname":"Si" }
]}';
var obj=eval("(" + text1 + ")");
alert(obj.employees[1].surname);
- JSON 解析器
– eval() 函数可编译并执行任何 JavaScript 代码,这隐藏了一个潜在的安全问题
– 使用 JSON 解析器将 JSON 转换为 JavaScript 对象是更安全的做法
– JSON 解析器只能识别 JSON 文本,而不会编译脚本
– 在浏览器中,这提供了原生的 JSON 支持,而且 JSON 解析器的速度更快