XML学习心得

作者: tobe_superman | 来源:发表于2016-09-30 02:04 被阅读0次

    前言

    为什么我会突然学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教程

    相关文章

      网友评论

        本文标题:XML学习心得

        本文链接:https://www.haomeiwen.com/subject/adkhyttx.html