概述
XML是可扩展性标记语言
XML数据格式最重要的作用就是数据传输
用途:
- 程序之间数据的传输通信,在网络中传输数据
- 配置文件config.xml(最多)
- 储存数据,当作小型数据库 data.xml
规范数据格式,使数据具有结构性,易读易处理
XML被发明的目的是传输和存储数据,而不是展示数据
XML的标签必须自定义,但是写标签名时一定要有含义
<?xml version="1.0" encoding="UTF-8"?>
<root>
<name>张三</name>
</root>
特点:
- 可扩展的,标签都是自定义的
- 语法十分严格
XML的基本语法
XML必须有根节点,是其他所有节点的父级节点
<?xml version="1.0" encoding="utf-8" ?>
<users>
<user id="123" number="1">
<name>张三</name>
<age>18</age>
</user>
<user id="456">
<name>李四</name>
<age>19</age>
</user>
<!-- 空元素close-->
<close/>
</users>
<!--这是XML的注释
1.XML种必须进行文档声明
version 版本信息
encoding 编码
2.文档声明必须写在第一行
3.XML中元素标签命名规则
1.标签定义不能使用空格 或 冒号
2.xml标签名称区分大小写
4.XML中有且只有一个根元素
5.元素体 可以是文本 或者 还是一个标签
6.属性是元素的一部分,只能出现再元素的开始标签中
属性值必须使用单引号或双引号包裹
一个元素标签可以定义多个属性
-->
XML描述数据形式如下
<?xml version="1.0" encoding="utf-8" ?>
<employees>
<employee id="1" >
<name>张三</name>
<age>18</age>
</employee>
<employee id="2">
<name>李四</name>
<age>19</age>
</employee>
</employees>
XML约束
编写一个文档来约束一个XML文档的书写规范
常见的XML约束:
- DTD
- Schema
XML由用户程序员编写,可由各种框架(spring、MyBatis等)解析
我们要引入约束,规范XML中的书写规则
看懂DTD
<!ELEMENT students (student+) >
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>
- ELEMENT 定义元素
students (student+):students 代表根元素
student+: 根标签中 至少有一个student子元素
student (name,age,sex) : student标签中可以 包含的子元素 按顺序出现
#PCDATA:普通的文本内容
ATTLIST:用来定义属性
student number ID:有一个ID属性叫做 number,是必须填写的
#REQUIRED: 表示number属性必须填写
ID: 表示唯一的值 不能重复 值只能是字母或者下划线开头
引入DTD
XSLT
XSLT是对XML文档进行转化的语言,可把XML变成html或其他任意代码
XSLT本身也是XML格式的文档, XSLT的文档节点是<xsl:stylesheet>
基本语法的学习
XSLT处理器在解释源文档的某个节点的时候,会查找匹配这个节点的规则。这种规则也被称做Template, 在XSLT中是用标签<xsl:template>
表示,该标签有个match属性来关联XPATH表达式。
<xsl:template match="/">
</xsl:template>
表示从跟节点开始遍历,"/"是XPATH表达式
而下面这个template
<xsl:template match="ACTSET/ACT[ENAME]">
<!-- 输出的内容:文本,属性 等 -->
</xsl:template>
仅作用于源文档中的<ACT>
节点集,一个<ACT>
节点下面还含有<ENAME>
子节点,并且这个<ACT>
必须是<ACTSET>
节点的直接子节点
match 属性的作用是使模板和XML与元素相匹配。match属性也可以为整个XML文档定义模版。Match属性值是一个XPath表达式。(例如:match="/" 定义整个文档)
小例子
<xsl:template match="ROWSET/ROW[ENAME]">
<Employee id="NX-{EMPNO}">
<xsl:value-of select="ENAME"/>
</Employee>
</xsl:template>
当匹配的模板被实例化后,接下来还会做三件事情:
- 模板中的文本和属性直接输出。任何不是以XSL命名空间开头的都被认为是文本,像上面例子里的
<Employee>
和 id 属性,它们会以文本形式直接输出。 - XSLT命名空间下的任何元素,都以文档中的先后顺序被执行。比如执行
<xsl:value-of>
元素,处理程序会根据select属性中的XPATH表达式获取到值,并以文本节点的形式替换<xsl:value-of>
元素。
<xsl:output>
元素
<xsl:output>
元素定义了输出文档的格式。
如 <xsl:output method="xml" indent="yes"/>
- method:定义了输出格式为xml
- indent:选"yes" 规定输出应根据其层次结构进行缩排。“no” 规定输出不应根据其层次结构进行缩排
<xsl:apply-templates>
元素
可把一个模板应用于当前的元素或者当前元素的子节点
向<xsl:apply-templates>
元素添加一个 select 属性,此元素就会仅仅处理与属性值匹配的子元素。我们可以使用 select 属性来规定子节点被处理的顺序
语法规则如下:
<xsl:template
name="name" -- name 模板名称
match="pattern" -- match Xpath语句,指定条件
mode="mode" -- mode模式,例如红,蓝等样式
priority="number"> -- priority 指定模板的优先级,为数字
<!-- Content: -->
</xsl:template>
<xsl:apply-templates>
元素
<xsl:apply-templates>
元素用于告诉处理器处理当前节点的所有子节点
向<xsl:apply-templates>
元素添加一个 select 属性,此元素就会仅仅处理与属性值匹配的子元素。我们可以使用 select 属性来规定子节点被处理的顺序
<xsl:copy-of>
元素
<xsl:copy-of>
元素可创建当前节点的一个副本
当前节点的 Namespace 节点、子节点以及属性都会被自动复制
<xsl:value-of>
元素
因为<xsl:template match=''>
中不能继续有match,match一般是匹配它的根节点,后面用value-of select那些
<xsl:template match='PLAY'>
<xsl:value-of select="ACT/TITLE"/>
<ACT>
</ACT>
</xsl:template>
用于提取某个 XML 元素的值,并把值添加到转换的输出流中
<xsl:value-of>
元素可用于选取某个 XML 元素的值,并把它输出
<xsl:for-each>
元素
用于选取指定的节点集中的每个 XML 元素
<xsl:for-each select="ACT">
<ACT>
<xsl:value-of select="TITLE"/>
</ACT>
</xsl:for-each>
</xsl:template>
<xsl:sort>
元素
如需对输出结果进行排序,只要简单地在 XSL 文件中的 <xsl:for-each>
元素内部添加一个 <xsl:sort>
元素
<xsl:if>
元素
用于放置针对 XML 文件内容的条件测试
语法
<xsl:if test="expression">
...如果条件成立则输出...
</xsl:if>
<xsl:choose>
元素
<xsl:choose>
元素用于结合 <xsl:when>
和<xsl:otherwise>
来表达多重条件测试。
语法
<xsl:choose>
<xsl:when test="expression">
... some output ...
</xsl:when>
<xsl:otherwise>
... some output ....
</xsl:otherwise>
</xsl:choose>
XPath
XPath是XML路径语言,用来确定XML文档中某部分位置。
XQuery
XQuery是一种针对于XML的查询语言,类似于SQL
<timetable>
<lecture title = "Databases" >
<lecturer title = "Dr">
<firstName >Ernest </firstName >
<lastName >Wilberforce </lastName >
</lecturer>
<occurrence day=" Tue " room=" CS1 " start= " 12:00:00 " finish ="14:00:00 "/>
<occurrence day=" Wed" room =" CS2 " start= " 15:00:00 " finish ="16:00:00 " />
</lecture >
<lecture title= " C++">
<lecturer title= "Professor " >
<firstName>Daniela </firstName>
<lastName>Strong </lastName>
</lecturer>
<occurrence day= " Tue " room =" CS1"
以上面这个XML文档为例子
文档的名字是"timetable.xml"
则doc("timetable.xml")
用于打开 “timetable.xml” 文件
路径表达式
另外:
doc("books.xml")/bookstore/book[price>30]/title
表示的是
可选取 bookstore 元素下的 book 元素下所有的 title 元素,并且其中的 price 元素的值必须大于 30
XQuery 使用路径表达式在 XML 文档中通过元素进行导航
下面的路径表达式用于在 “timetable.xml” 文件中选取所有的 lecture 元素
doc("timetable.xml")/timetable/lecture
/timetable 选取 timetable 元素,/lecture 选取 timetable 元素下的所有lecture 元素
- 下面这个 FLWOR 表达式所选取的数据和上面的路径表达式是相同的:
<lectures>
for $v in
doc("timetable.xml")/timetable/lecture
return $v
</lectures>
for 语句把 timetable 元素下的所有 lecture 元素提取到名为 $v 的变量中
上面的xml文档完整版:
则结果是
where表达式
doc("books.xml")/bookstore/book[price>30]/title
可以转换为
for $x in doc("books.xml")/bookstore/book
where $x/price>30
return $x/title
<lectures>
for $v in
doc("timetable.xml")/timetable/lecture
where $v/occurrence/@day="Tue "
return $v
</lectures>
let 语句
let 语句可完成变量分配
let $x := (1 to 5)
return <test>{$x}</test>
结果是
<test>1 2 3 4 5</test>
exercise
- All book titles
<catalog>
{
for $x in doc("books.xml")/catalog/book/title
return $x
}
</catalog>
- ids of books that cost more than £20
for $x in doc("books.xml")/catalog/book
where $x/price>20
return <book>{$x/@id}</book>
3. Titles and publication dates of books published after 2001-01-01, listed in
the order published. Compare dates using >
for $x in doc("books.xml")/catalog/book
where $x/publish_date>"2001-01-01"
order by $x/publish_date
return
<book>
{$x/title }
{$x/publish_date}
</book>
4. A list of genres. distinct-values(…) can remove duplicate nodes in
the for clause
for $x in distinct-values(doc("books.xml")/catalog/book/genre)
return
<book>
{$x}
</book>
但如果我们用
for $x in distinct-values(doc("books.xml")/catalog/book/genre)
return $x
只会得到
5. A list of genres, and within each a list of authors who write in that genre.
Hint: use nested XQuery expressions.
<genre_authtos>
{
for $x in distinct-values(doc("books.xml")/catalog/book/genre)
return
<genre>
<name>{$x}</name>
{
for $y in distinct-values(doc("books.xml")/catalog/book[genre=$x]/author)
return
<author>
{$y}
</author>
}
</genre>
}
</genre_authtos>
6. Pairs of books you can buy for £11 or less, with the cost for each pair.
<books>
{
for $x at $xMoney in doc("books.xml")/catalog/book
for $y at $yMoney in doc("books.xml")/catalog/book
let
$sum := $x/price + $y/price
where $sum < 11 and $xMoney < $yMoney
return
<buy>
<bookOne>{$x/title}</bookOne>
<bookSecond>{$y/title}</bookSecond>
<cost>{$sum}</cost>
</buy>
}
</books>
XML DOM
DOM 将 XML 文档作为一个树形结构,而树叶被定义为节点
W3C DOM 被分为 3 个不同的部分/级别(parts / levels):
- 核心 DOM
- XML DOM
- HTML DOM
什么是 XML DOM
XML DOM 定义了所有 XML 元素的对象和属性,以及访问它们的方法(接口)
即XML DOM 是用于获取、更改、添加或删除 XML 元素的标准
节点
XML 文档中的每个成分都是一个节点
- 整个文档是一个文档节点
- 每个 XML 标签是一个元素节点
- 包含在 XML 元素中的文本是文本节点
- 每一个 XML 属性是一个属性节点
- 注释属于注释节点