XML文档都是一种跨平台的数据交换方式,它本质上又是一种文本文件,而文本文件都涉及换行字符的问题。ASC2标准指定了两个行尾控制字符:回车符(CR,即/r)和换行符(LF,即/n),但具体到实际操作系统又各有区别,就目前的主流操作系统来看,主要有如下3种换行符:
Windows平台: 以回车符(CR)和换行符(LF)的组合存储换行,这对字符与打字机设置新行的动作非常相似
UNIX和Linux平台:以换行符(LF)存储换行
Macintosh平台:以回车符(CR)存储换行
XML统一以换行符(LF)存储换行
Xml文件只是一个静态的文件,无作为,
可对外提供一些信息,但不能完成任何的动态行为。
HTML主要侧重于显示数据
XML最大的可扩展,侧重于传输和存储数据
XML在JAVAEE中的应用:
a.XML配置文件
b.简化数据交换格式
c.Web Service(服务,粗粒度)
SOA(面向服务的架构)
XML在某些方面的替代:
1.XML配置文件 struct 2 / Spring EJB等等。现在都可改为使用Annotation
。但两者的本质相同,只是数据的载体不同而已
2.数据交换方面。XML有一个很多的替代解决方案:JSON .
Xml能传的信息json一样能传,并且所需的数据传输量更小
3类XML文档: [W1]
Malformed,不满足4个基本规则
Well formed 满足4个基本规则,但没有语义约束,或有语义约束但不pi配
Valid: 满足4个基本规则,语义约束
浏览器区分XML,只区分是否格式良好
实际应用时: XML + 语义约束
XML声明 不是必须的
<?xml ?>
Version = “1.0” 这个属性是必须的,并且通常此属性都排在第一位
Encoding = “” 此属性告诉XML处理工具,用怎样的字符集来对XML文档进行解码
此属性应与保存此文档时所用的字符集相同
默认值是utf-8
standalone 属性说明文档是否独立 standalone = “yes”
合法的标签名,
子元素之间可以重复,有顺序。
属性之间不可以重复,无序。
字符数据:
开始标签和结束标签之间的一段文本。 (HTML会把多个连续的空格字符减为一个,但XML则会保留所有空白)
<! [CDATA[ ]]> cdata区应用多
cdata区的起始和结束处有和没有空格和换行字符是有区别的。
cdata区内部不能出现字符串” ]]>”
<!-- [X3] -->
css显示
<?xml-stylesheet type=”text/css” href=”book.css” ?>
XML DOM:
xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue
· xmlDoc -由解析器创建的 XML 文档
· getElementsByTagName("to")[0] - 第一个 <to> 元素
· childNodes[0] - <to> 元素的第一个子元素(文本节点)
· nodeValue - 节点的值(文本本身)
function parseXML()
{
try //Internet Explorer
{
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
}
catch(e)
{
try //Firefox, Mozilla, Opera, etc.
{
xmlDoc=document.implementation.createDocument("","",null);
}
catch(e)
{
alert(e.message);
return;
}
}
xmlDoc.async=false;
xmlDoc.load("note.xml");
document.write("<td>");
document.write(
x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue);
document.write("</td>");
XSL - 不仅仅是样式表语言,XSL 包括三部分:
XSLT 一种用于转换 XML 文档的语言。 [W4]
XPath 一种用于在 XML 文档中导航的语言。
XSL-FO 一种用于格式化 XML 文档的语言。
XSLT 元素参考:
元素 描述 IE N
apply-imports 应用来自导入样式表中的模版规则。 6.0
apply-templates 向当前元素或当前元素的子元素应用模板。 5.0 6.0
attribute 向元素添加属性。 5.0 6.0
attribute-set 创建命名的属性集。 6.0 6.0
call-template 调用一个指定的模板。 6.0 6.0
choose 与<when>以及<otherwise>协同使用,来表达多重条件测试。 5.0 6.0
comment 在结果树中创建注释节点。 5.0 6.0
copy 创建当前节点的一个备份(无子节点及属性)。 5.0 6.0
copy-of 创建当前节点的一个备份(带有子节点及属性)。 6.0 6.0
decimal-format 定义当通过 format-number() 函数把数字转换为字符串时,所要使用的字符和符号。 6.0
element 在输出文档中创建一个元素节点。 5.0 6.0
fallback 假如处理器不支持某个XSLT元素,规定一段备用代码来运行。 6.0
for-each 遍历指定的节点集中的每个节点。 5.0 6.0
if 包含一个模板,仅当某个指定的条件成立时应用此模板。 5.0 6.0
import 用于把一个样式表中的内容倒入另一个样式表中。 6.0 6.0
include 把一个样式表中的内容包含到另一个样式表中。 6.0 6.0
key 声明一个命名的键。 6.0 6.0
message 向输出写一条消息(用于错误报告)。 6.0 6.0
namespace-alias 把样式表中的命名空间替换为输出中不同的命名空间。 6.0
number 测定当前节点的整数位置,并对数字进行格式化。 6.0 6.0
otherwise 规定 <choose> 元素的默认动作。 5.0 6.0
output 定义输出文档的格式。 6.0 6.0
param 声明一个局部或全局参数。 6.0 6.0
preserve-space 用于定义保留空白的元素。 6.0 6.0
processing-instruction 生成处理指令节点。 5.0 6.0
sort 对结果进行排序。 6.0 6.0
strip-space 定义应当删除空白字符的元素。 6.0 6.0
stylesheet 定义样式表的根元素。 5.0 6.0
template 当指定的节点被匹配时所应用的规则。 5.0 6.0
text 通过样式表生成文本节点。 5.0 6.0
transform 定义样式表的根元素。 6.0 6.0
value-of 提取选定节点的值。 5.0 6.0
variable 声明局部或者全局的变量。 6.0 6.0
when 规定 <choose> 元素的动作。 5.0 6.0
with-param 规定需被传入某个模板的参数的值。 6.0 6.0
使用Template元素定义模板: match="/" [W5]
使用apply-tempates处理子节点:[W6]
使用value-of输出节点内容:DEMO
转换包含子元素的节点
转换属性
转换处理指令
转换注释 select="comment()"
Pi配节点的模式:
/ // . .. [] 等
Select="node()" Pi配除属性和XML文档根之外的所有节点
Select="text()" Pi配当前上下文中的所有文本节点
Select="comment()" Pi配当前上下文中的所有注释
Select="id()" 只有此属性声明为ID类型时,id()表达式才有效
Mode属性: DEMO
只有当<apply-templates ../>的mode属性和<template ../>的mode属性相同时,此模板规则才会生效
XSLT转换分类:
客户端转换
流程控制元素:
循环控制 demo
排序控制 DMEO
控制空白:
<preserve-space element=""/>保留空白
<strip-space element=""/>删除空白
创建元素和属性:
使用element创建元素 DEMO
属性值模板 DEMO
使用attribute创建属性 DEMO
命名属性集 DEMO
创建文本 DEMO
创建处理指令 DEMO
创建注释 <xsl:comment> 静态注释内容:<xsl:value-of select=""f >
复制 DEMO
输出格式化数值 DEMO
变量和参数:
<variable ../> 定义变量
<param ../> 定义参数
使用元素体指定值 DEMO
全局的和局部的变量和参数 DEMO
改变参数值 DEMO
命名模板,提高代码复用率 DEMO
指定输出格式:
XSLT 函数:
XQuery 1.0、XPath 2.0 以及 XSLT 2.0 共享相同的函数库。
名称 | 描述 |
返回当前节点的节点集。 [W12] | |
用于访问外部 XML 文档中的节点。DEMO | |
检测 XSLT 处理器是否支持指定的元素。 DEMO | |
把数字转换为字符串。DEMO | |
检测 XSLT 处理器是否支持指定的函数。DEMO | |
返回唯一标识指定节点的字符串值。DEMO | |
Key() |
|
将树转换为节点集。产生的节点集总是包含单个节点并且是树的根节点。 | |
返回系统属性的值。DEMO | |
返回未解析实体的 URI。 DEMO |
XSLT2.0常用新功能 [W13]
多文档输出 result-document DEMO
字符映射 [W14] character-mappting DEMO
Value-of元素的改进 DEMO
数据类型在邦定(用处不大) DEMO
正则表达式 <xsl:analyze-string> DEMO
用户自定义han数 <xsl:function> DMEO
Xpath[W15] :
节点(Node)
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。
下面列出了最有用的路径表达式:
表达式 | 描述 |
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | |
. | 选取当前节点 |
.. | |
@ |
谓语(Predicates)
路径表达式 结果
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。 /bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。 /bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。 book[position() = last()]
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng'] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。 /bookstore/book[price>35.00] 选取所有 bookstore 元素的 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取所有 bookstore 元素中的 book 元素的 title 元素,且其中的 price 元素的值须大于 35.00。
轴(axis)
Attribute book/@isbn 等同于 child::book/attribute::isbn
Child 选取当前节点的所有子节点 ../book 等同于parent::node()/child::book
Parent 当前节点的父节点
Self 选取当前节点本身
选取未知节点
通配符 | 描述 |
* | 匹配任何元素节点 |
@* | 匹配任何属性节点 |
node() | 匹配任何类型的节点 |
选取若干路径
路径表达式 结果
//book/title | //book/price 选取所有 book 元素的 title 和 price 元素。
//title | //price 选取所有文档中的 title 和 price 元素。
/bookstore/book/title | //price 选取所有属于 bookstore 元素的 book 元素的 title 元素,以及文档中所有的 price 元素。
位置路径表达式
位置路径可以是绝对的,也可以是相对的。
绝对路径起始于正斜杠( / ),而相对路径不会这样。在两种情况中,位置路径均包括一个或多个步,每个步均被斜杠分割:
绝对位置路径:
/step/step/...
相对位置路径:
step/step/...
算术运算符 div 除 mod 余
比较运算符
逻辑运算符 or 或 and 与
Xpath2.0新增加的表达式:
If表达式 DEMO
Some/every表达式 some是任一项满足,every是全部项都要满足 DEMO
Xpath2.0的类型支持:
可以显式地指定某项的值的数据类型,基于Schema内置类型的 DEMO
XQuery[W19] DEMO XML
上下文项表达式 doc("books.xml")/bookstore/book/title
谓语 doc("books.xml")/bookstore/book[price<30]
直接量: xs:string
变量引用:$book
圆括号表达式:
调用han数:
序列表达式:
构造序列
1. 使用逗号 (1,2,3,4)
2. 使用to关键字 DEMO
过滤表达式 DEMO (3 to 8)[.mod 3 eq 0]
组合节点序列
1. 并集 DEMO
2. 交集 DEMO
3. 减法 DEMO
算术表达式:
Div 除 idiv 整除 mod 求余
比较表达式:
值比较 eq 等于 ne 不等于 lt 小于 le 小于等于 gt 大于 ge 大于等于
通用比较 = 等
节点比较 is >> << 等
逻辑表达式:
1 eq 1 and 2 eq 2 返回true
1 eq 1 or 2 eq 2 返回true
构造器:
直接构造 <author>{$book/author}</author>
FLWOR表达式: DEMO
For let where order by return 最常用 功能强大的
If表达式: DEMO
与序列类型有关的表达式:
Instance of 2 instance of xs:integer 返回true
Typeswitch DEMO
Cast DEMO
Castable 与cast经常一起使用,在使用cast进行实际类型转换之前,应该先使用castable判断此变量是否可以转换为对应的类型 “123” castable as xs:string
XQJ (类似于JDBC) DEMO
处理指令:
和声明的语法相同
<?处理指令名 attr1=val1 attr2=val2 ?>
常用指令:
属性和元素:从简洁性的角度来看,属性比子元素要简单得多,
Spting 1.1大量使用子元素写法
Spring1.2大量使用属性写法
从要扩展性的角度看,子元素写法更具有更好的可扩展性
W3C建议除data 其他的都使用子元素
两种主要语义约束:
DTD
XML Schema
DTD是早期的,简单,但功能较弱,Schema是现在的,强大,但比较复杂
引入DTD:
内部DTD: 在XML文档内定义DTD <!DOCTYPE 根元素名 [ ] > DEMO
外部DTD: 在XML文档外定义 <!DOCTYPE 根元素名 SYSTEM “dtd文档的uri” > DEMO book.dtd
公用DTD: 在XML文档外定义 <!DOCTYPE 根元素名 PUBLIC “dtd的唯一标识” “dtd文档的uri” > DEMO
DTD定义:
<!ELEMENT 元素名 元素类型[X21] > 定义元素
无序子元素 <!ELEMENT 计算机 (书名|作者|价格)+ >
<!ATTLIST 定义属性
<!ENTITY 定义实体
<!NOTATION 定义符号
这四种元素彼此独立
定义属性:
属性必须依附于元素才能存在
<ATTLIST 可以为一个元素定义一个或多个属性。
<!ATTLIST 元素名
属性名 属性类型 [元素对属性的约束] [默认值]
属性名 属性类型 [元素对属性的约束] [默认值] ..
>
两种情况必须指定默认值 没有约束,或约束为#FIXED
两咱情况不能指定默认值 约束为#IMPLIED #REQUIRED
#FIXED 表示某些固定值
属性 CDATA #FIXED “sdfsdfsdf”
属性 CDATA “dsfsdf” <!—如果不设置其属性,就默认用这个,如果设置了.....-->
属性类型:
#REQUIRED 必需的属性[X22] <!ATTLIST 作者 地址 CDATA #REQUIRED>
#IMPLIED 可有可无的属性
#FIXED 其属性的值是固定的,无须为其分配此属性,自动的 <!ATTLIST 作者 地址 CDATA #FIXED "广州">
CDATA字符串 CDATA与NMTOKEN区别
NMTOKEN 要求属性值是标识符字符串[X23] (#不行 空格不行 ....特殊符号不可以)
NMTOKENS 要求属性值是多个NMTOKEN 用空格隔开
(en1 | en2 | en3 .) 枚举 (若有#PCDATA时,要把#PCDATA放到最前面)
<!ATTLIST 水果 类型 (苹果|梨|桔子) #REQUIRED>
ID 要求属性值是标识符, 其值不能重复 action.xml action.dtd
IDREF 要求属性必须引用到一个已经已有的ID 值,多个值之间用空格隔开
IDREFS
XML预置的实体引用:
< <
> [X24] >
& &
' ;
" “
定义实体:
用一个字符串代表另一个字符串
<!ENTITY cs “项目冲刺班”>
这样用这个实体 &cs; (在XML中使用实体)
普通实体 <!ENTITY 实体名 "实体值"> &实体; 普通实体是在XML文档中使用的
参数实体 <!ENTITY % 实体名 "实体值"> %实体; class.xml class.dtd
参数实体只能在DTD中使用
外部实体 <!ENTITY 实体名 SYSTEM "实体值所在的URL"> & ;
外部参数实体 <!ENTITY % 实体名 SYSTEM "实体值所在的URL"> % ;
未解析实体
元素类型可分为:
任意类型:ANY(不受限制)
字符串类型:#PCDATA
<!ELEMENT 元素名 (#PCDATA)>
空元素类型:EMPTY (只允许有属性,相当于没有元素体)
包含子元素:
有序子元素:<!ELEMENT book (name , price)> 逗号
无序子元素:没有特定语法,只能先将它们组成互斥组,然后对互斥组添加频率词(? * .)
互斥子元素:(用 | 隔开)
成组子元素:(绑在一起 用( )括起来)
子元素出现的频率:与正则表达式相同的3个符号紧跟某个子元素或元素组
混合类型:当XML元素里既有子元素,也包含字符串。
<!ELEMENT (#PCDATA | .. )*> DEMO