![Java核心技术·卷Ⅱ:高级特性(原书第10版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/937/34339937/b_34339937.jpg)
3.1 XML概述
在卷Ⅰ第13章中,你已经看见过用属性文件(property file)来描述程序配置。属性文件包含了一组名/值对,例如:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/117-i.jpg?sign=1738907735-ibsGOA9JusMfYbbyudxRpeL8grMLIKNU-0-7aad79b06bd155bc674e38d7e59175d9)
你可以用Properties类在单个方法调用中读入这样的属性文件。这是一个很好的特性,但这还不够。在许多情况下,想要描述的信息的结构比较复杂,属性文件不能很方便地处理它。例如,对于下面例子中的fontname/fontsize项,使用以下的单一项将更符合面向对象的要求:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/117-2-i.jpg?sign=1738907735-cGNVoQUQeLZJLGCbV7EiUtAGu5hU8t4Y-0-a3f8668ed2850e7e2ece652d878dba43)
但是,这时对字体描述的解析就变得很讨厌了,必须确定字体名在何处结束,字体大小在何处开始。
属性文件采用的是一种单一的平面层次结构。你常常会看到程序员用如下的键名来努力解决这种局限性:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/118-i.jpg?sign=1738907735-YXDFDoFP8xaEhXbK3Jdm1Q0pNLHoxPSD-0-90b69975f354b1e278ee73a2d3391d42)
属性文件格式的另一个缺点是要求键是唯一的。如果要存放一个值序列,则需要另一个变通方法,例如:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/118-2-i.jpg?sign=1738907735-N38V3oiaA1BQpkKReqNgl5ew7voEyotV-0-9a7bef0a32b4c728f92048bb63294334)
XML格式解决了这些问题,因为它能够表示层次结构,这比属性文件的平面表结构更灵活。
描述程序配置的XML文件可能会像这样:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/118-3-i.jpg?sign=1738907735-gfSWf9WFAkjuWY1JvVIISnFwUGzfN06H-0-49dc723cb4fca5230ac6b1459f63864f)
XML格式能够表达层次结构,并且重复的元素不会被曲解。
正如上面看到的,XML文件的格式非常直观,它与HTML文件非常相似。这是有原因的,因为XML和HTML格式是古老的标准通用标记语言(Standard Generalized Markup Language,SGML)的衍生语言。
SGML从20世纪70年代开始就用于描述复杂文件的结构。它的使用在一些要求对海量文献进行持续维护的产业中取得了成功,特别是在飞机制造业中。但是,SGML相当复杂,所以它从未风行。造成SGML如此复杂的主要原因是SGML有两个相互矛盾的目标。它既想要确保文档能够根据其文档类型的规则来形成,又想要通过可以减少数据键入的快捷方式使数据项变得容易表示。XML设计成了一个用于因特网的SGML的简化版本。和通常情况一样,越简单的东西越好,XML立即得到了长期以来一直在躲避SGML的用户的热情追捧。
注意:在http://www.xml.com/axml/axml.html处可以找到一个由Tim Bray注释的XML标准的极佳版本。
尽管HTML和XML同宗同源,但是两者之间存在着重要的区别:
·与HTML不同,XML是大小写敏感的。例如,<H1>和<h1>是不同的XML标签。
·在HTML中,如果从上下文中可以分清哪里是段落或列表项的结尾,那么结束标签(如</p>或</li>)就可以省略,而在XML中结束标签绝对不能省略。
·在XML中,只有单个标签而没有相对应的结束标签的元素必须以/结尾,比如<img src="coffeecup.png"/>。这样,解析器就知道不需要查找</img>标签了。
·在XML中,属性值必须用引号括起来。在HTML中,引号是可有可无的。例如,<applet code="MyApplet.class" width=300 height=300>对HTML来说是合法的,但是对XML来说则是不合法的。在XML中,必须使用引号,比如,width= "300"。
·在HTML中,属性名可以没有值。例如,<input type="radio" name="language" value="Java" checked>。在XML中,所有属性必须都有属性值。比如,checked= "true"或checked="checked"。