XML

本文探讨了在XML文档中使用属性和元素的最佳实践,强调了数据存储的重要性,并介绍了如何使用XML解析器处理XML文档,同时提供了关于XML编码和转义字符的实用指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

XML应该尽量避免使用属性

首先看三个例子,下面的三个XML文档包含了相同的信息:

第一个例子使用了data属性:

< note  date ="12/11/99" >
< to > Tove </ to >
< from > Jani </ from >
< heading > Reminder </ heading >
< body > Don't forget me this weekend! </ body >
</ note >  

 

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

 

< note >
< date > 12/11/99 </ date >
< to > Tove </ to >
< from > Jani </ from >
< heading > Reminder </ heading >
< body > Don't forget me this weekend! </ body >
</ note >  

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

 

< note >
< date >
< day > 12 </ day >
< month > 11 </ month >
< year > 99 </ year >
</ date >
< to > Tove </ to >
< from > Jani </ from >
< heading > Reminder </ heading >
< body > Don't forget me this weekend! </ body >
</ note >   

这里有一些使用属性引发的问题: 

  • 属性不能包含多个值(子元素可以)。     
  • 属性不容易扩展。     
  • 属性不能够描述结构(子元素可以)。     
  • 属性很难被程序代码处理。     
  • 属性值很难通过DTD进行测试。     

如果使用属性来存储数据,那么所编写的XML文档一定很难阅读和操作。尽量使用元素来描述数据,仅使用属性来描述那些与数据关系不大的额外信息。

属性规则的例外

我的关于属性的规则也有一个例外:

有些时候应该为一个元素设计一个ID引用,通过这个ID可以引用存取特定的XML元素,就象HTML中的name和id属性一样。请看下面的例子:

 

< 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属性就相当于一个计数器,或者是一个唯一的标识符,在XML文档中标识不同的便条信息,他不是便条信息的一部分。

重点:元数据(与数据有关的数据)应该以属性的方式存储,而数据本身应该以元素的形式存储。

XML解析器

微软的XML解析器是和IE5.0+浏览器捆绑在一起的。

一旦安装了IE5.0,那么就获得了XML解析器。这个浏览器除了被浏览器内部调用外,还可以在脚本中或者程序中调用。这个解析器的特点是支持与程序设计语言无关的编程模型,他支持以下技术:

  • JavaScript, VBScript, Perl, VB, Java, C++ 等等    
  • W3C XML 1.0 和 XML DOM    
  • DTD 和 XML文档验证    

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

 

var xmlDoc=new ActiveXObject("Microsoft.XMLDOM") 

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

 

set xmlDoc=CreateObject("Microsoft.XMLDOM")

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

set xmlDoc=Server.CreateObject("Microsoft.XMLDOM") 

 

命名空间属性

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

 

xmlns:namespace-prefix="namespace" 

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

 

xmlns:f="http://www.w3schools.com/furniture" 

W3C 命名规范声明命名空间本身就是一个统一资源标示符Uniform Resource Identifier (URI)

注意:用来标识命名空间的网络地址并不被XML解析器调用,XML解析器不需要从这个网络地址中查找信息,该网络地址的作用仅仅是给命名空间一个唯一的名字,因此这个网络地址也可以是虚拟的,然而又很多公司经常把这个网络地址值象一个真实的Web页面,这个地址包含了关于当前命名空间更详细的信息。

定义一个默认的XML命名空间使得我们在子元素的开始标记中不需要使用前缀。语法如下所示:

 

< element  xmlns ="namespace" >

 

XML编码

Windows 95/98 记事本不能以Unicode的编码格式保存文件,编辑XML文件必须进行编码属性设置。

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

 

<? xml version="1.0" encoding="gb2312" ?>  

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

 

<? xml version="1.0" encoding="gbk" ?>

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

 

<? xml version="1.0" encoding="UTF-8" ?>  

Windows 2000 记事本可以以Unicode编码格式、"UTF-16"编码格式保存文件。

如果在XML文档中声明了编码属性,而又以Unicode编码格式保存文件,将发生错误。

结论:

在保存XML文档之前在XML文档的声明中设置文档的编码格式,一些关于避免错误发生的建议:

  • 使用一种支持Unicode编码格式的编辑器。 
  • 确信你知道自己正在使用那种编码格式。 
  • 在XML文档中使用属性声明设置编码格式。 

 

转义字符 

不合法的XML字符必须被替换为相应的实体。

 

为了避免出错,必须将字符转换成实体,例如:

 

< message > if salary  &lt;  1000 then </ message >

下面是五个在XML文档中预定义好的实体:

&lt;

小于号

&gt;

大于号

&amp;

&

&apos;

'

单引号

&quot;

"

双引号


实体必须以符号"&"开头,以符号";"结尾

 

CDATA部件

在CDATA内部的所有内容都会被解析器忽略。

如果文本包含了很多的"<"字符和"&"字符——就象程序代码一样,那么最好把他们都放到CDATA部件中。

一个 CDATA 部件以"<![CDATA[" 标记开始,以"]]>"标记结束,例:

< script >
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0)   then
{
return 1
}
else
{
return 0
}
}
]]>
</script>

这里,所有在CDATA部件之间的文本都会被解析器忽略。

注意:

CDATA部件之间不能嵌套。

在字符串"]]>"之间没有空格或者换行符。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值