XML文件格式已经出来很久了。他的风头如今在JSON、YAML等新兴文件格式的冲击下已经显的不那么强劲。但是XML仍然是当今世界上使用最广泛的文件格式。围绕着它也有一大堆的概念和知识点。所以我们还是很有必要全面了解下。

XML

XML全称为eXtensible Markup Language,即可扩展标记语言。其被设计用来传输及存储数据。

XML与HTML看似比较相似,但是其设计目的并不相同。

  • XML用来传输及存储数据,主要关注数据是什么。

  • HTML用来显示数据,主要关注数据看起来是什么样。

  • HTML的tag是预定义的,比如说table标签,浏览器会知道它是什么含义。

  • XML的tag不是预定义的,需要自己设计tag并描述tag的含义。XML中的tag如果不借助XSLT文件,浏览器只会以简单的文本方式展示。

很多人认为HTML是XML文件的一个子集。其实这种观点是错误的,因为HTML的实现并未严格遵循XML的语法。比如XML要求每个tag必须要有闭合标记,XML的tag是大小写敏感的,XML给tag添加的属性必须要使用引号包起来…这些语法要求HTML都不满足。

请看XML的一个示例。

book.xml
1
2
3
4
5
6
7
<?xml version="1.0" encoding="ISO-8859-1"?>
<book>
<name>Effective JavaScript</name>
<category>Program Language</category>
<author>Bowen</author>
<description>This book is about JavaScript Language.</description>
</book>

这是一个简单的XML文件。第一行说明了xml的版本及编码类型。接下来是一个根节点book,根节点可以包含很多子节点。

XML命名空间

由于XML的tag并不像HTML那样是预定义的,那么很有可能两个XML中的同名tag具有不同的含义。那么在合并XML等操作时势必会造成冲突。解决的办法就是给XML的tag加上命名空间(即namespace),每一个namespace都可以指定一个前缀。这些前缀会区分同名tag。

假设这里有另一个xml文件。

anotherBook.xml
1
2
3
4
5
6
<?xml version="1.0" encoding="ISO-8859-1"?>
<book>
<name>Rework</name>
<page>120</page>
<publishDate>2013-10-08</publishDate>
</book>

如果我们要合并这两个xml节点到同一个xml文件中时,不加namespace会发生冲突,因为含有同名的tag,其子节点的结构并不相同。接下来我们给其加上命名空间并合并。

combined.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<root>
<ns1:book xmlns:ns1="http://www.huangbowen.net/ns1">
<ns1:name>Effective JavaScript</name>
<ns1:category>Program Language</category>
<ns1:author>Bowen</author>
<ns1:description>This book is about JavaScript Language.</description>
</book> <ns2:book xmlns:ns2="http://www.huangbowen.net/ns2">
<ns2:name>Rework</name>
<ns2:page>120</page>
<ns2:publishDate>2013-10-08</publishDate>
</book>
</root>

xmlns是xml namespace的缩写。引号后面是tag的前缀。这个前缀可以省略,比如xmlns="http://www.huangbowen.net/ns1",相当于没有前缀的tag自动应用默认的命名空间。需要注意的是命名空间的URI只是给命名空间提供一个唯一的标识,xml解析器并不会访问这个URI来获取任何信息。很多公司习惯将这个URI一个web页面,该web页面描述了该namespace的相关信息。

XSD

XSD全称为XML Schema Definition,即XML结构定义语言。每个XSD文件是对一个XML文件的结构定义。
由于XML中的tag并不是预定义的,那么每人都可以创建自己的XML结构文档。如果你想让别人按照你的标准创建一份xml文件,你可以使用XSD文件来描述你的标准。

这是针对本文示例book.xml文件的一个XSD文件。

book.xsd
1
2
3
4
5
6
7
8
9
10
11
12
13
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="book">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="name"/>
<xs:element type="xs:string" name="category"/>
<xs:element type="xs:string" name="author"/>
<xs:element type="xs:string" name="description"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

从上可以看出其实XSD文件本身就是一个XML文件,它遵循XML语法,比如每个tag都需要有结束标记,必须有且只有一个根节点等。

在一个XML文件中可以添加其Schema的引用信息。

book.xml
1
2
3
4
5
6
7
<?xml version="1.0" encoding="ISO-8859-1"?>
<ns1:book xmlns:ns1="http://www.huangbowen.net/ns1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:targetLocation="http://www.huangbowen.net/book.xsd">
<ns1:name>Effective JavaScript</name>
<ns1:category>Program Language</category>
<ns1:author>Bowen</author>
<ns1:description>This book is about JavaScript Language.</description>
</book>

在IDE中,如果你的XML节点没有遵守你引用的Schema中的定义,就会给出错误提醒。

XSLT

XSLT全称为EXtensible Stylesheet Language Transformations。 XSLT用于将XML文档转换为XHTML或其他XML文档。

在讲XSLT之前我们先讲讲XSL。XSL全称为Extensible Stylesheet Language,即可扩展样式表语言。众所周知,CSS是HTML文件的样式表,而XSL则是XML文件的样式表。XSL文件描述了XML文件应该如何被显示。

其实XSL不仅仅是样式表语言,它主要包含3部分:

  • XSLT - 用来转换XML文档

  • XPath - 查询和操作XML文档中的节点

  • XSL-FO - 格式化XML文档

XSLT使用XPath来查找XML中的元素。

XSLT通过一个xml文件来定义源xml文件与目标文件之间的转换关系。该xml文件必须以<xsl:stylesheet><xsl:transform>作为根节点。

对于本文的示例book.xml,如果我们使用浏览器打开显示效果如下。

现在我们创建一个XSLT文件将其转换为一个HTML文件。

book.xsl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/">
<html>
<body>
<h2>My Book</h2>
<table border="1">
<tr>
<td>name</td>
<td><xsl:value-of select="book/name" /></td>
</tr>
<tr>
<td>category</td>
<td><xsl:value-of select="book/category" /></td>
</tr>
<tr>
<td>author</td>
<td><xsl:value-of select="book/author" /></td>
</tr>
<tr>
<td>description</td>
<td><xsl:value-of select="book/description" /></td>
</tr>
</table>
</body>
</html>
</xsl:template> </xsl:stylesheet>

然后我们在book.xml文件中加入对这个XSLT文件的引用。

book.xml
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="book.xsl"?>
<book>
<name>Effective JavaScript</name>
<category>Program Language</category>
<author>Bowen</author>
<description>This book is about JavaScript Language.</description>
</book>

接下来我们再用浏览器打开book.xml文件,发现显示变成了这样。是不是很神奇?

注意如果你使用chrome打开该book.xml文件,请设置chrome的--allow-file-access-from-files属性,这样chrome才允许加载本地的xsl文件。解决方案看这里:http://stackoverflow.com/questions/3828898/can-chrome-be-made-to-perform-an-xsl-transform-on-a-local-file

OK,这篇文章讲的够多了,下篇接着讲XPath,XML to Object以及XML文档格式与近来风头强劲的JSON、YAML格式的比较。

XML相关知识全接触(一)的更多相关文章

  1. XML相关知识

    XML的定义:  XML即可扩展标记语言标记是指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等.如何定义这些标记,既可以选择国际通用的标记语言,比如HTML,也可以使用 ...

  2. Web客户端语言HTML、XHTML和XML相关知识介绍

    HTML简介 HTML(Hyper Text Mark-up Language)即超文本标记语言或超文本链接标示语言,是目前网络上应用最为广泛的语言,也是构成网页文档的主要语言.HTML文本是由HTM ...

  3. web.xml相关知识摘录整理

    web.xml 中的listener. filter.servlet 加载顺序及其详解 在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人 ...

  4. AndroidManifest.xml相关知识

    AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest  ...

  5. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  6. 【转】Microsoft .Net Remoting之Remoting事件处理全接触

    Remoting事件处理全接触 前言:在Remoting中处理事件其实并不复杂,但其中有些技巧需要你去挖掘出来.正是这些技巧,仿佛森严的壁垒,让许多人望而生畏,或者是不知所谓,最后放弃了事件在Remo ...

  7. web前端学习(三)css学习笔记部分(8)-- SVN的介绍和应用、CSS动画效果、CSS3布局属性全接触

    15.SVN的介绍和应用 15.1.SVN的介绍和应用课程概要 将代码进行集中管理,有版本号的进行迭代,方便集体工作的build流程 15.2.SVN的介绍 SVN是Subversion的简称,是一个 ...

  8. listener监听器的相关知识

    从别人的博客上我学习了listener的相关知识现在分享给大家 1.概念: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上 ...

  9. NSString使用stringWithFormat拼接的相关知识

    NSString使用stringWithFormat拼接的相关知识 保留2位小数点 1 2 3 4 //.2代表小数点后面保留2位(2代表保留的数量) NSString *string = [NSSt ...

随机推荐

  1. python面向对象个人总结

    基础概念:面向对象其实就是类与对象的使用. 类是模板,对象是实例.模板创建实例,实例去类里面去执行类的方法.类的例子: class Foo:           def Bar(self):      ...

  2. c#访问Oracle问题及解决方法

    Q:访问oracle 查询条件带汉字结果集为空的问题 A:数据库连接字符串中加入Unicode=true即可. 如 <add key="DbConnectionString" ...

  3. mysql 索引分类

    在数据库表中,对字段建立索引可以大大提高查询速度.通过善用这些索引,可以令 MySQL的查询和运行更加高效.索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常 ...

  4. 使用max() 函数

    /********************************* 代码功能:使用串口输出a和b的最大值 使用函数:max(a,b); 创作时间:2016*11*04 作者邮箱:jikexianfe ...

  5. MATLAB - 练习程序,求灰度图像均值、最大、最小数值

    clear all; close all; clc img=imread('lena.bmp'); figure; imshow(uint8(img)); [m n]=size(img); img_m ...

  6. coursera 机器学习课程 GraphLab环境准备

    在网上看到coursera有机器学习的课程,正好再学习学习,温固一下,还有很多其他的课程也很好.收费的哟! 手机APP和网站收取的费用有差异,网站上要便宜一下,费用差的挺多的,果断在网站上支付了. 有 ...

  7. linux 下两台电脑之间ssh无密码连接

    例子:在192.168.0.12使用tecmint用户,连接192.168.0.11主机上的sheena用户 Step 1: Create Authentication SSH-Kegen Keys ...

  8. 自定义php安装(2)—mysql安装和php整合

    1.      写一段php 代码来测试是否成功! //目前你看不懂,没关系 <?php $conn=mysql_connect("localhost","root ...

  9. [转]linux14.04下caffe的安装步骤

     linux14.04下caffe的安装步骤   原文地址:http://blog.csdn.net/xiaoyang19910623/article/details/52997481?locatio ...

  10. java中final,finally和finalize的区别

    final,finally和finalize的区别: final:最终的意思,可以修饰类,成员变量,成员方法 修饰类,类不能被继承 修饰变量,变量是常量 修饰方法,方法不能被重写 finally:是异 ...