XML入门

XML笔记

首先:学习XML需要有一定的HTMLJavaScript的基础

一、什么是XML

XML是可扩展标记语言 eXtensible Markup Language
多用来传输和储存数据

  • XML是一种标记语言
  • XML是用来传输数据的语言而不是显示数据
  • XML语言需要自行定义标签并且具有自我描述性
    • XML在意的是数据内容(传输信息)
    • HTML在意的是数据的外观(显示信息)

举例说明:XML文档实例 Jani写给Tove的便签

<?xml version="1.0"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

上面的这条便签具有自我描述性。它包含了发送者和接受者的信息,同时拥有标题以及消息主体。但是,这个 XML 文档仍然没有做任何事情。它仅仅是包装在 XML 标签中的纯粹的信息。我们需要编写软件或者程序,才能传送、接收和显示出这个文档。

通过XML可以发明自己的标签

  • 上述例子中标签中没有在任何XML标准中定义过<to>和<form>XML中没有预定义的标签相
  • 对比HTML中的标签全都是通过HTML定义过的标签
  • XML允许创业者定义自己的标签和自己的文档结构

二、XML的用途

XML把数据从HTML分离

首先举一个例子当你需要在HTML文档中显示动态数据,那么每当数据改变的时候,都要花费我们大量的时间去编辑HTML。通过XML数据能够给储存在独立的XML文件中。这样我们就可以专注于使用HTML/CSS进行显示和布局,并且可以在修改底层数据的时候不在需要对HTML进行改变。通过使用几行JavaScript代码,我们可以读取一个外部XML文件,并更新我们的网页数据内容

XML简化数据共享

XML数据以纯文本格式进行存储,因此提供了一种独立与软件和硬件的数据储存方法。这就可以让创建不懂应用程序可以共享的数据变得更加容易

简化数据传输

互联网上的不兼容的系统之间交换数据对于程序员来说是一件很费时的事情,这时yogaXML交换数据就降低了从不兼容的应用程序中读取数据的复杂性

三、XML的树结构

XML文档形成了一种树的结构,它从“根部”开始,然后扩展到 "枝叶"。

树结构是通常被称为 XML 树,并且可以很容易地描述任何 XML 文档。
通过采用树状结构,你可以知道所有从根开始的后续的分行及支行。

一个XML文档实例

XML 文档使用简单的具有自我描述性的语法:

<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

第一行是XML的生命。它定义XML的版本(1.0)和所使用的编码(ISO-8859-1 = Latin-1 / 西欧字符集)。下一行描述文档的根元素(比如说:本文档是一个标签):

<note>

接下来的四行描述根的四个子元素(to,form,heading以及body):

<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>

最后一行的定义根元素的结尾:

</note>

这个事例中描述的是一张Jani写给Tove的便签显示出了XML具有独特的自我描述性

XML文档形成一种树结构

XML文档必须包含根元素。钙元素是所有其他元素的父元素。
XML文档中的元素形成了一颗文档树。

这棵树从根部开始,并扩展到树的最低端。
所有的元素都可以有子元素:

<root>
<child>
<subchild>.....</subchild>
</child>
</root>

父、子以及通报等术语用于描述元素之间的关系。父元素拥有子元素。相同层级上的子元素成为问题(兄弟或姐妹)。
所有的元素都可以有文本内容和属性(类似HTML中)。

实例XML中的一本书:

实例
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>

实例中的根元素是<bookstore>。文档中的所有<book>元素都被包含在<bookstore>中。<book>元素中有四个子元素:<title>、<author>、<year>、<price>

XML语法

语法规则

所有XML都必须有一个关闭标签

在HTML中,有些元素不必须有一个关闭标签:

<p>This is a paragraph.
<br>

而在XML中,省略关闭标签是非法的

<?xml version="1.0" encoding="UTF-8" ?>
<p>This is a paragraph.</p>

注释:打开标签和关闭标签通常被称为开始标签和结束标签,本质上是相同的。

XML是大小写敏感的语言

XML标签对大小写敏感,需要用相同的大小写来编写打开标签和关闭标签

<Message>This is incorrect</message>
<message>This is correct</message>

XML必须正确嵌套

在HTML中,经常会有没有正确嵌套的元素:

<b><i>This text is bold and italic</b></i>

而在XML中,所有元素都必须彼此正确的嵌套

<b><i>This text is bold and italic</i></b>

两者的区别是i和b的结束标签是否要和i和b的起始标签相对应。

XML文档必须有根元素

XML文档必须有一个元素是所有其他元素的父元素。该元素为根元素

<root>
<child>
<subchild>.....</subchild>
</child>
</root>

XML属性值必须加引号

与HTML类似,XML元素也可以拥有属性(名称、值得对)。
在XML中、XML的属性值必须加引号。
请研究下面两个XML文档。第一个是错误的,第二个是正确的:

<note date=12/11/2007>
<to>Tove</to>
<from>Jani</from>
</note>
<note date="12/11/2007">
<to>Tove</to>
<from>Jani</from>
</note>

实体引用

在XML中,一些字符拥有特殊的意义
如果我们把字符"<"放到XML元素中,会发生错误,这是因为解析器会把它当做新元素的开始。
这样会产生XML错误:

<message>if salary < 1000 then</message>

为了避免这个错误需要用实体引用来代替"<"字符

 <message>if salary &lt; 1000 then</message>

在XML中,有五个预定义的实体引用:

在XML中,只有字符“<”和“&”确实是非法的,大于号是合法的但是用实体引用来代替它是好的习惯

预定义实体

注释:在XML中,只有字符“<”和“&”确实是非法的。大于号是合法的,但是用实体引用来代替是推荐的方式

XML中的注释

XML中注释和HTML中的注释相同

在XML中,空格会被保留

HTML会把多个连续的空格字符裁减合并为一个

HTML hello tove
Output hello tove

XML以LF储存换行

在Windows程序中,换行通常是以一对字符来存储的:回车符(CR)和换行符(LF)。
在Unix和Mac OSX中,使用LF来存储新行。

XML元素

XML元素概述

XML元素是XML文档中不可缺少的,可以将XML元素看成是一个容器,其中存放了文本、元素、属性,媒体对象或所有的这些。


XML文档包含XML元素。
每个XML文档包含一个或者多个元素,其范围是任一分隔的有开始和结束标记,或者为空元素,用一个空元素标签。

什么是XML元素?

XML元素指的是从(且包括)开始标签到(且包括)结束标签的部分。
一个元素可以包含:

  • 其他元素
  • 文本
  • 属性
  • 或混合以上所有
<bookstore>
<<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title>Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>

上述代码描述的是bookstore中的两本书
book元素也有属性<title>、<author>、<year> 和 <price> 有文本内容,因为他们包含文本。

XML元素的命名规则

XML元素必须遵从一下命名规则

  • 名称可以包含字母、数字以及其他字符

  • 名称不能以数字或者标点符号开始

  • 名称不能以字母xml(不区分大小写的任何xml 组合)开始

  • 名称不能包含空格

可使用任何名称,没有保留的字词。

最佳命名习惯

使名称具有描述性。使用下划线的名称也很不错:<first_name>、<last_name>。

名称应简短和简单,比如:<book_title>,而不是:<the_title_of_the_book>。

避免 "-" 字符。如果您按照这样的方式进行命名:"first-name",一些软件会认为您想要从 first 里边减去 name。

避免 "." 字符。如果您按照这样的方式进行命名:"first.name",一些软件会认为 "name" 是对象 "first" 的属性。

避免 ":" 字符。冒号会被转换为命名空间来使用(稍后介绍)。

XML 文档经常有一个对应的数据库,其中的字段会对应 XML 文档中的元素。有一个实用的经验,即使用数据库的命名规则来命名 XML 文档中的元素。

在 XML 中,éòá 等非英语字母是完全合法的,不过需要留意,您的软件供应商不支持这些字符时可能出现的问题。

XML元素是可扩展的

XML元素的扩展,便于携带更多的信息。
如下XML实例

请看下面的 XML 实例:

<note>
<to>Tove</to>
<from>Jani</from>
<body>Don't forget me this weekend!</body>
</note>

设想我们创建了一个应用程序,可将<to>、<from> 以及 <body>元素从XML文档中提取出来,并产生以下的输出:

输出

这时我们可以在文档中添加一些额外的信息:

<note>
<date>2008-01-10</date>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

我们即使加上了这些内容程序不会因此而崩溃或者中断,这个程序仍然可以找到XML中的 to、from 以及 body元素,并且产生同样的输出。XML的优势之一,就是可以在不中断应用程序的情况下进行扩展。
另外:XML中,所有的元素必须有结束标记!

XML属性

XML的属性

在XML的元素中,一个XML元素可以有一个或多个属性。
属性是XML元素的一部分,每一个元素可以有多个独特的属性。属性提供了有关XML元素的详细信息XML属性始终都是一个 名称/值 的对
在HTML中,属性提供有关元素的额外信息。

<img src="computer.gif">
<a href="demo.html">

属性通常提供不属于数据组成部分的信息。在下面的实例中,文件类型与数据无关,但是对需要处理这个元素的软件来说却很重要:

<file type="gif">computer.gif</file>

XML属性必须加引号

属性值必须被引号包围,不过单引号双引号都可以使用EP:

<person sex = "female">
/or
<person sex = 'female'>

如果属性本身包含双引号可以使用单引号

<gangster name='George "Shotgun" Ziegler'>

或者可以使用字符实体:

<gangster name="George"Shotgun"Ziegler">

XML元素vs.属性

先看一个实例:

<person sex="female">
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
<person>
<sex>female</sex>
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>

在第一个实例中,sex是一个属性。在第二个实例中,sex是一个元素。这两个实例都是用来提供相同的信息的。什么时候使用属性没有固定的要求。在HTML中,属性用起来很方便,但是在XML中,尽量避免使用属性,如果信息感觉起来很像数据,尽量使用元素。

推荐方式

一下三个XML文档中所包含的内容是完全相同的:
第一个实例中使用date属性:

<note date="10/01/2008">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

第二个实例中使用date元素:

<note>
<date>10/01/2008</date>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

第三个实例中使用扩展的date元素(鼎力推荐):

<note>
<date>
<day>10</day>
<month>01</month>
<year>2008</year>
</date>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

需要避免的XML属性

因为使用属性而引其的一些问题:

  • 属性不能包含多个值(元素可以)
  • 属性不能包含树结构(元素可以)
  • 属性不容易扩展(为未来的变化)

属性难以阅读和维护。请尽量使用元素来描述数据。

针对元数据的XML属性

有时回想元素分配ID引用可用于标识XML元素,它起作用的方式与HTML中id属性是一样的。下面实例演示了这种情况:

<messages>
<note id="501">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
<note id="502">
<to>Jani</to>
<from>Tove</from>
<heading>Re: Reminder</heading>
<body>I will not</body>
</note>
</messages>

上述的id属性仅仅只是一个标识符,用于标识不同的标签。他并不是便签数据的组成部分。
在这里笔者想说的是:元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素。

XML属性需要遵循的规则

  • 属性名称不能在同一起始标签或空元素标签中出现一次
  • 一个属性必须使用属性表声明的文档类型定义(DTD)的声明
  • 属性值不能包含直接或间接的实体引用外部实体
  • 任何实体的替换文本成为直接或间接的属性值中不能包含任何小于号

XML DTD

XML 验证

DTD为英文 Document Type Definition,中文意思为 “文档类型定义”。


拥有正确语法的XML被称为“形势良好”的XML。
通过DTD验证的XML的“合法”的XML。

形式良好的XML文档

"形式良好" 的 XML 文档拥有正确的语法。
在前面的章节描述的语法规则:

  • XML 文档必须有一个根元素
  • XML 元素都必须有一个关闭标签
  • XML 标签对大小写敏感
  • XML 元素必须被正确的嵌套
  • XML 属性值必须加引号
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

验证XML文档

合法的XML文档是 "形式良好" 的 XML 文档,这也符合文档类型定义(DTD)的规则:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE note SYSTEM "Note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

在上面的实践中,DOCTYPE声明是对外部DTD文件的引用。

XML DTD

DTD的目的是定义XML文档的结构。他使用了一系列的合法的元素来定义文档的结构:

<!DOCTYPE note
[
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>

XML验证器

使用我们额XML验证器来对我们的XML文件进行语法检查

XML错误会终止您的程序

XML文档中的错误会终止我们的XML程序。
W3C的XML规范声明:如果XML文档存在错误,那么程序就不应当继续处理这个文件。理由是:XML软件应当轻巧快速,具有良好的兼容。
如果使用HTML,创建包含大量错误的文档是有可能的(比如忘记添加结束标签),其中一个主要的原因是HTML浏览器相当的臃肿,兼容性也很差,并且他们有自己的方式来确定当发现错误时文档应该显示为什么样子。使用XML时,这种情况不应当存在

查看XML文件

查看 XML 文件

XML文件中包含了许多元素,XML格式的信息和其他标记的基本单元,以及各种各样的数据。查看文件顾名思义就是对XML文件进行查看。


首先在所有的主流浏览器中,均能查看原始的XML文件,但是不要指望XML文件会直接显示为HTML页面的形式。

<?xml version="1.0" encoding="ISO-8859-1"?>
- <note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body >
</note>

XML文档将显示为代码颜色化的根以及元素,通过点击元素左侧的加号(+)或者减号(-),可以展开或者收起元素的结构。要查看原始的XML源(不包括 + 和 - 符号),选择“查看页面源代码”或者从浏览器菜单中的“查看源文件”即可。
注释:在Safari中,只有元素的文本将被显示,要查看原始的XML,必须有机单击页面,选择“查看源文件”。

XML和CSS

使用CSS来显示XML

通过使用CSS可以显示信息到XML文档中

使用CSS显示XML

使用CSS来格式化XML文档是有可能的。
下面是关于如何使用css样式来格式化XML文档:

XML文件:CD目录.

样式表: CSS文件

最后,查看:使用CSS文件格式化CD目录

下面是XML文件的一小部分。第二行把XML文件链接到CSS文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/css" href="cd_catalog.css"?>
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD>
<TITLE>Hide your heart</TITLE>
<ARTIST>Bonnie Tyler</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS Records</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1988</YEAR>
</CD>
.
.
.
</CATALOG>

使用CSS格式化XML不是常用的方法。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容