上一篇我们初步了解了XML的特点和用途,这一篇,我们将一起由浅入深学习XML的树结构、语法、元素等内容。
--------------------------------------------------------------------------------------------------------------------------------------------------------
一、XML的结构——树结构
不知道大家是否还记得上一篇的例子,这里我们再举一个的栗子:
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Rose</to>
<from>Jake</from>
<heading>Invitation</heading>
<body>Let's have dinner together!</body>
</note>
我们来分析一下这个栗子,第一行是XML的声明,定义了XML的版本(1.0)和所使用的编码方式(ISO-8859-1);
第二行是文档的根元素,可以理解为描述文挡的关键词,即文章是一个note;接下来四行描述了根的四个子元素,即<to><from><heading><body>,这四个子元素相当于描述了根元素的内部结构,即note内部包括的内容有收件人、发件人、标题以及主体四个部分;最后一行定义了根元素的结尾。
本例应该是十分清晰地展现出了XML的结构特征,下面我们做一下总结:
1、XML文档必须包含根元素,该元素是其它所有元素的父元素;
2、XML文档的元素形成了一课树形结构,所有元素均可以拥有子元素:
<root>
<child>
<subchild>...</subchild>
</child>
</root>
3、下面我们假设用XML来描述一个书店
(取自W3School,侵删):
<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>JK.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>,其又含有子元素<title><author><year><price>,其中对<book>和<title>有更详细地描述,我们后面接着讲。
二、XML的语法规则
XML的语法规则相对简单易学,下面我们对其语法规则进行罗列。
1、XML的所有元素都必须要有关闭标签,从前面的例子我们可以看到类似<book></book>的标签均是成对出现的,后者即为关闭标签,相应的前者为打开标签(或称为 开始标签、结束标签);(XML的声明是不需要关闭标签的,因为声明不属于XML本身,也不是元素,故而不需要关闭标签)
2、标签对大小写敏感,<book></Book>是非法的;
3、XML必须正确嵌套,例如
<a><b>This is wrong</a></b>
<a><b>This is true</b></a>
所谓正确嵌套就是<b>在<a>中打开,那么<b>也应当在<a>中关闭;
4、XML的属性值必须加引号,例如前面的
<book category="COOKING">
5、对于一类特殊的引用,例如"<"放在XML的引用中会发生错误,编译器会当做是新元素的开始来处理,因此我们会使用实体引用来代替,在XML中有五个预定义好的实体引用:
< | < |
> | > |
& | & |
' | ' |
" | " |
三、XML的元素
1、XML元素的含义,其实在前面的例子中我们已经多次提到了元素这个概念,元素是指从开始标签到结束标签的部分(包括开始标签和结束标签);元素可以包含其他元素、文本或者两者混合,元素也可以拥有属性;
2、XMl的命名规则,元素不能以数字或者标点开始,不能包含空格,不能以字符xml(或其改变大小写)开始;
3、XML的元素可以扩展,以便携带更多的信息,什么叫可扩展呢,举个栗子,此前我们有这样的XML
<note>
<to>Rose</to>
<from>Jake</from>
<heading>Invitation</heading>
<body>Let's have dinner together!</body>
</note>
Jake约Rose吃晚饭,我们写了个小程序可以将<to><from><body>的元素提取出来,并产生下面输出:
To:Rose
From:Jake
Let's have dinner together!
此时程序在运行中,然后我们向XML文档中又添加了一些额外信息:
<note>
<date>2017-02-28</date>
<to>Rose</to>
<from>Jake</from>
<heading>Invitation</heading>
<body>Let's have dinner together!</body>
</note>
此时程序会挂掉吗?答案是不会,程序依然能够找到<to><from><body>并将其中的元素提取出来。因此联想到之前我们提到的和HTML的分离,XML可以实现应用程序不中断的情况下对底层数据进行扩展。
四、XML的属性
上文提到属性这个概念,例如<book category = "COOKING">就是一个很好的例子,属性提供了关于元素的附加信息,属性的值是必须要加引号的。
属性和元素在很多情况下可以互通使用,还是上面Jake邀请Rose吃饭的例子,我们还有另外两种:
<note date="2017-02-28">
<to>Rose</to>
<from>Jake</from>
<heading>Invitation</heading>
<body>Let's have dinner together!</body>
</note>
或者扩展方式:
<note>
<date>
<day>28</day>
<month>2</month>
<year>2017</year>
</date>
<to>Rose</to>
<from>Jake</from>
<heading>Invitation</heading>
<body>Let's have dinner together!</body>
</note>
这三种方式中,我们更加建议的是避免使用XML属性,因为属性嵌套、属性无法描述树形结构、属性不易扩展、同时属性难以阅读和维护,因此更建议使用元素的方式来构建XML文档。
TIPS:
针对元数据时(data about data即描述数据的数据),例如有时候会分配ID,用这些ID来标识XML元素,仍然使用上面的例子,我们做一些扩展:
<messages>
<note id="1">
<to>Rose</to>
<from>Jake</from>
<heading>Invitation</heading>
<body>Let's have dinner together!</body>
</note>
<note id="2">
<to>Jake</to>
<from>Rose</from>
<heading>Re:Invitation</heading>
<body>Let's have dinner together!</body>
</note>
<message>
对于属性和元素的使用,更建议的是:元数据应当存储为属性,而数据本身应当存储为元素!