自我描述性
XML(Extensible Markup Language) 和 HTML 非常类似,HTML 更加侧重于数据的表现和展示,而 XML 则更加侧重于数据的传输和存储。
相比于 HTML ,XML 有一个特性是 自我描述性 ,其本意是指 XML 不需要任何文档说明,就可以方便的阅读。我觉得它更像是三个特性的概括:
- 独立于所有的平台,不像 HTML 依赖于浏览器或者互联网。
- XML 不会做任何事情,即 XML 标签没有被预定义。
- XML 元素是可扩展,以携带更多的信息,即其子节点个数并不固定
也就是说,XML 是一种既通用,又特化(特化在了过于通用和稳定上)的标记语言,其设计思路,其实和配置语言类似了。
语法
声明 Declaration
声明位于 XML 文档的开头,用于指定 XML 文档的源信息, <?xml ... ?>
是用来声明XML文档的开始部分,而 <!DOCTYPE ... >
用于定义文档类型,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fontconfig SYSTEM 'urn:fontconfig:fonts.dtd'>
DOM
和 HTML 类似,XML 文档也可以被解析为一棵 DOM 树,所以具体的语法参见 HTML 。
转义
XML 中的字符 <
和 &
是关键的语法标记,另外还有一些字符用得也比较多,所以都推荐用转义字符来表达字符原意,不过和 ANSI 的转义字符不同,他们有一套特殊的写法:
转义前 | 转义后 |
---|---|
< | < |
> | > |
& | & |
' | ' |
" | " |
其他
XML 还有一些其他语法规则,一并列出:
- XML 标签对大小写敏感
- XML 属性值必须加引号
- XML 中空格会被保留,而不是去除或者合并(与 HTML 存在差异)
DTD
既然 XML 是不提供预定义元素的,所以 XML 中出现的所有元素都需要自定义。有一种定义 XML 文档的方式被称为 DTD(Document Type Defination) 。它的存在有点类似于 LaTeX 中的 documentclass
。
不过可惜的是,了解 DTD 语法或者了解具体的 DTD 文件并不会让我们更好得理解 XML 文档本身,因为 DTD 更像是一份语法规范,并不涉及对于语义的定义,这和它的设计目的——传输和存储是相适应的。传输和存储并不需要过于强大的语义能力,而是应该用语法约束,这样才能有普遍性。
举个例子,一份定义 note
的 DTD 文件
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
对于的 XML 文件:
<!DOCTYPE fontconfig SYSTEM 'note.dtd'>
<note>
<to>Steve</to>
<from>Jenny</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>
可以看到即使 DTD 中规定了 note, to, from
等元素的形式,但是看到这些定义并没有让我们更好的理解文章的含义。