XML学习心得

前言

为什么我会突然学XML呢?我在学习用JSP写Web后台的时候,常常会看到“等价的XML语句”、“符合XML标准”等字眼,并且在我新建的JSP项目中也发现有很多的.xml文件,我很想知道这些.xml文件的作用以及与JSP(或者说是与Java)的联系,就试着开始学习XML了。

简介

XML的全称为可扩展标记语言(eXtensible Markup Language),很多人应该都熟悉HTML(超文本标记语言, HyperText Markup Language)。与HTML一样,XML也是一种标记语言,是一种特殊的文本标记。两者在形式上很相似,比如都有类似这样的符号:<xx>字符</xx>,作用上也都能用来传输与显示数据。下面是一个简单的XML文档:

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

XML与HTML的区别

1.在HTML中不区分大小写,而XML对大小写十分敏感必须严格区分:

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

2.在HTML中,有时不严格,如果上下文清楚地显示出段落或者列表在何处结尾,那么就可以省略</p>或者</li>之类的结束标签:

<p>This is a paragraph.

<li>HTML
<li>XML

而在XML中,省略关闭标签是非法的,所有元素都必须有关闭标签。而像<br />这种拥有单个标签而没有匹配的结束标签的必须用一个/字符作为结尾:

<p>This is a paragraph.</p>
<br />

3.在HTML中,常会看到没有正确嵌套的元素:

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

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

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

PS:元素是指从(且包括)开始标签直到(且包括)结束标签的部分。

以上面的代码为例,正确嵌套的即为由于<i>元素是在<b>元素内打开的,那么它必须在<b>元素内关闭

4.在HTML中,引导属性值的引号是可用可不用的。在XML中,属性值必须被引号包围:

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

5.HTML会把多个连续的空格字符合并为一个。在XML中,文档中的空格不会被删减。

6.XML文档形成一种树结构。XML 文档必须有一个元素是所有其他元素的父元素,该元素称为根元素。下面的代码形成一种树结构:

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

7.HTML使用固有的标签,而且都是预定义的。常见的标签有:

  • 基本标签:<html><head><body>
  • 文本标签:<font><p>
  • 列表标签:<ol><ul><li>
  • 表格标签:<table><tr><td>

此外还有<img>(插入图像标签)、<a>(超链接标签)、<form>(表单标签)等。
XML中并没有固有的标签,所有的标签都是自定义的而且可扩展的(这也印证了XML名称中的extensible)。以上文简介中的代码为例:

<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
  • <note>标签告诉读者这是一个便签
  • <to>标签告诉读者便签是写给Tove
  • <from>标签告诉读者便签是Jani写的
  • <heading>标签告诉读者便签的标题为Reminder(即便签有提醒的作用)
  • <body>标签告诉读者便签的内容

这些标签都是作者在编写XML文档的过程中根据要编写的数据的含义来定义的。

8.HTML和XML都有属性。在XML中,属性通常提供不属于数据组成部分的信息:

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

这个例子中,文件类型GIF与数据computer.gif无关,但却告诉读者要用处理GIF文件的程序来处理computer.gif这个文件。
下面是两个不同的XML文档:

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

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

它们的区别在于第一个文档中sex为元素person的一个属性,而第二个文档中sex自身就是一个元素,它们都告诉读者Anna Smith是一名女性。
很重要的提示:不要滥用属性!请看下面一段代码:

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

这并不是XML正确的使用方式!
还有一种情况就是针对元数据的属性:

<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仅仅是一个标识符,用于标识不同的便签note,它并不是便签中数据的组成部分。
XML中并没有明确规定什么时候该用元素,什么时候该用属性,因此建议大家尽量避免使用属性。如果需要存储的信息感觉起来很像数据,那么请使用元素,而那些元数据(有关数据的数据)则应当存储为属性。

最重要的区别(自我认为)

  • XML被设计用来存储和传输数据,其焦点是数据的内容。
  • HTML被设计用来显示数据,其焦点是数据的外观。

通俗地说就是HTML旨在显示数据,而XML旨在传输数据。
还是以上文简介中的代码为例:

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

想要单纯地列举出便签写给谁、便签谁写的、便签的标题、便签的内容这些数据,用HTML做一个无序列表就能实现:

<html>
<head>
<title>note</title>
</head>
<body>
<li>Tove</li>
<li>Jani</li>
<li>Reminder</li>
<li>Don't forget me this weekend!</li>
</body>
</html>

这段代码运行起来是这样的效果:

note.html运行效果图

现在我想问,单看这张图,能知道这个便签是谁写的吗?是Tove还是Jani?或者可能这个便签是写给Tove和Jani两个人的,也许只有文档的作者自己知道。现实生活中还会有更复杂的例子,比如记录家庭成员关系的文档、记录某件商品价格变动的文档,如果用HTML做成无序列表一一列举出来的话,就会出现一大串人名、一大串数字,没有其他任何的解释信息,我想也只有作者能看懂这些文档吧。
这就是HTML的作用,把数据显示出来,怎么好看就怎么显示。显示的方式有很多种,例如用文本、列表、表格等,但显示出的数据内容并没有改变,只是外观发生了改变。
但XML就不一样,我们可以用XML编写出下面两个文档:

<family>
<grandfather>Jack</grandfather>
<grandmother>Betty</grandmother>
<father>Mike</father>
<mother>Jessie</mother>
<uncle>Felix</uncle>
<aunt>Anna</aunt>
<son>Tom</son>
<daughter>Amy</daughter>
<January></January>
</family>

<price>
<January>$35.00</January>
<February>$36.00</February>
<March>$35.60</March>
<April>$37.00</April>
<May>$38.00</May>
<June>$36.00</June>
</price>

通过以上两个文档,我们可以清楚地知道每个人名对应的人物关系、每个价格对应的月份。
这就是XML的作用,作者在编写XML文档的过程中根据数据的含义定义和扩展标签,这样数据就和特定的标签联系起来并存储,在传输的过程中读者通过这些标签能够明白数据的含义。
肯定会有人有疑问:为什么不在HTML中使用类似的<grandfather>、<January>这些标签呢?很抱歉,HTML没有预定义这些标签,并且HTML中的标签不能扩展,只能使用预定义好的标签。
又有人会说,我也可以用HTML将数据的含义显示出来呀,就像这样:

<html>
<head>
<title>note</title>
</head>
<body>
<li>to:Tove</li>
<li>from:Jani</li>
<li>heading:Reminder</li>
<li>body:Don't forget me this weekend!</li>
</body>
</html>

这确实是个很不错的方法,读者也能看懂数据的含义。但如果编写文档的目的只是方便用户在需要的时候查看文档中存储的数据然后关闭的话,就没有必要写这么冗长、繁琐的一段代码了。利用XML编写,几行代码就能搞定,而且用记事本打开.xml文件就能查看:

note.xml运行效果图

这就是XML比HTML优秀的地方,代码虽短,却能完整、清楚地显示出数据及其含义,同时又方便查看,可以跨平台使用。

后记

作为两种不同的语言,HTML有它的好处,XML也有它的优点。我写本文的目的并不是在这两者中评一个孰优孰劣,我只是想把一些XML的基础语法和我自己对这门语言的理解与感悟分享给大家。每门语言就像不同的工具,用最合适的语言高效地编写程序、完成项目,我觉得这才是一名程序员要努力做到的。

学习资料来源

菜鸟教程——XML教程

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

推荐阅读更多精彩内容