XML应该尽量避免使用属性
首先看三个例子,下面的三个XML文档包含了相同的信息:
第一个例子使用了data属性:






第二个例子使用了data元素:







第三个例子使用了扩展的data元素: (这就是我推荐的样式):











这里有一些使用属性引发的问题:
- 属性不能包含多个值(子元素可以)。
- 属性不容易扩展。
- 属性不能够描述结构(子元素可以)。
- 属性很难被程序代码处理。
- 属性值很难通过DTD进行测试。
如果使用属性来存储数据,那么所编写的XML文档一定很难阅读和操作。尽量使用元素来描述数据,仅使用属性来描述那些与数据关系不大的额外信息。
属性规则的例外
我的关于属性的规则也有一个例外:
有些时候应该为一个元素设计一个ID引用,通过这个ID可以引用存取特定的XML元素,就象HTML中的name和id属性一样。请看下面的例子:














在上面的例子中,ID属性就相当于一个计数器,或者是一个唯一的标识符,在XML文档中标识不同的便条信息,他不是便条信息的一部分。
重点:元数据(与数据有关的数据)应该以属性的方式存储,而数据本身应该以元素的形式存储。
XML解析器
微软的XML解析器是和IE5.0+浏览器捆绑在一起的。
一旦安装了IE5.0,那么就获得了XML解析器。这个浏览器除了被浏览器内部调用外,还可以在脚本中或者程序中调用。这个解析器的特点是支持与程序设计语言无关的编程模型,他支持以下技术:
- JavaScript, VBScript, Perl, VB, Java, C++ 等等
- W3C XML 1.0 和 XML DOM
- DTD 和 XML文档验证
如果浏览器使用JavaScript作为脚本语言,那么利用下面的代码可以创建XML文档对象:

如果浏览器使用VBScript作为脚本语言,那么利用下面的代码可以创建XML文档对象:

如果在ASP程序中使用VBScript脚本语言,那么就可以使用下面的代码形式:

命名空间属性
命名空间属性一般放置在元素的开始标记处,其使用语法如下所示:

在上面的例子中,命名空间定义了一个Internet 地址:

W3C 命名规范声明命名空间本身就是一个统一资源标示符Uniform Resource Identifier (URI)。
注意:用来标识命名空间的网络地址并不被XML解析器调用,XML解析器不需要从这个网络地址中查找信息,该网络地址的作用仅仅是给命名空间一个唯一的名字,因此这个网络地址也可以是虚拟的,然而又很多公司经常把这个网络地址值象一个真实的Web页面,这个地址包含了关于当前命名空间更详细的信息。
定义一个默认的XML命名空间使得我们在子元素的开始标记中不需要使用前缀。语法如下所示:

XML编码
Windows 95/98 记事本不能以Unicode的编码格式保存文件,编辑XML文件必须进行编码属性设置。
下面的编码类型不会导致错误, 并且汉字显示正常:

下面的编码类型不会导致错误,并且汉字显示正常:

下面的编码类型不会导致错误,并且汉字显示正常:

Windows 2000 记事本可以以Unicode编码格式、"UTF-16"编码格式保存文件。
如果在XML文档中声明了编码属性,而又以Unicode编码格式保存文件,将发生错误。
结论:
在保存XML文档之前在XML文档的声明中设置文档的编码格式,一些关于避免错误发生的建议:
- 使用一种支持Unicode编码格式的编辑器。
- 确信你知道自己正在使用那种编码格式。
- 在XML文档中使用属性声明设置编码格式。
转义字符
不合法的XML字符必须被替换为相应的实体。
为了避免出错,必须将字符转换成实体,例如:

下面是五个在XML文档中预定义好的实体:
< | < | 小于号 |
> | > | 大于号 |
& | & | 和 |
' | ' | 单引号 |
" | " | 双引号 |
实体必须以符号"&"开头,以符号";"结尾。
CDATA部件
在CDATA内部的所有内容都会被解析器忽略。
如果文本包含了很多的"<"字符和"&"字符——就象程序代码一样,那么最好把他们都放到CDATA部件中。
一个 CDATA 部件以"<![CDATA[" 标记开始,以"]]>"标记结束,例:















这里,所有在CDATA部件之间的文本都会被解析器忽略。
注意:
CDATA部件之间不能嵌套。
在字符串"]]>"之间没有空格或者换行符。