当前位置: 移动技术网 > IT编程>网页制作>XML > XML简易教程之三

XML简易教程之三

2017年12月08日  | 移动技术网IT编程  | 我要评论
xml的未来 现在你已经知道xml。确实,结构有点复杂,而且dtd有各种可以定义文档可以包含的内容的选项。但还不只这些。考虑一个数据交换对其很重要的产业,如银行。银行使用所

xml的未来
现在你已经知道xml。确实,结构有点复杂,而且dtd有各种可
以定义文档可以包含的内容的选项。但还不只这些。

考虑一个数据交换对其很重要的产业,如银行。银行使用所有
权系统来跟踪内部的交易,但是如果他们在web上使用一种通用
的xml格式,那么他们必须描述交易信息给另一个机构或应用程
序(如quicken或ms money)。当然,他们也可以在web页面上
表示数据。fyi:这个标记不存在。它叫做ofex,开放金融交易
格式(open financial exchange)。

在某种情况下,如果pc上的ie 4碰到一个<softpkg> 标记符,一
个函数会被启动以给用户更新已安装的软件的机会。如果你用
的是windows 98,你可能看见过这种情况,但是不知道它是一
个xml应用程序。

这里我们有三个xml应用程序,看起来与andy grove在70年代看
到的加法机、打字机和铅笔不同。但是与最终出现在pc上的应
用程序相似,xml的好处可以被一般性地描述为:“当你使用人
类和机器可读的标记符描述你的数据时,会有好事发生的。”

这些好事是什么呢?我不知道。但是我也不知道我的pc上的下
一代程序将会是什么样。只要数据以这种方式标记,可以产生
不同的应用。

你开始考虑它会扩展到什么程度了吗?

我们有很多xml的实际应用可以谈论,我会在不久的将来谈到它
们的。既然我们都是网民,以后将是xsl(扩展样式语言 -
extensible style language)了。

顺便提一句,这个菜谱确实是我妈妈_的,而且很杰出。如果你
用之,再加半杯碎椰子。


我写这篇文章是因为我真诚地关心你对我的看法。我担心的是:如果你读过我写的xml简介然后准备开始写自己的xml文档。于是你开始寻找一个已经建立的dtd来表示你的信息。你找到一个,如下所示:

 

<!attlist fn

%attr.lang;

value cdata #fixed "text">

<!entity % attr.img "

img.type cdata #required

img.data entity #required">


马上你就会认为jay一定是一个白痴。他没有说关于attlist和entity的任何事 - 不管它们是什么。

那么让我们谈谈这件事,先有一点耐心。

上面这些行可能不好看,但实际上没什么。它们被用在dtd中来定义xml文档中的属性和实体。了解html的人会对这很清楚。属性是带有html标记符的条目,用来更准确地描述标记符。在经常出现的<img src="my.gif" height="20" width="20">中,有两个属性:height和width。你在后面会看到,在xml文档使用属性与之很相似。

对实体也没有什么新东西。如果你用过&,你就已经掌握了最基本的东西。一个被&和分号包围起来的字符串用来表示另一个或一套字符。(这里有iso实体的完整清单。)

当然,xml中属性和实体还有其它功能。这就不可避免地要引入语法,虽然不太多。一旦知道了这些,就会不费劲地使用xml文档。

简化菜谱

如果你读过我写的xml简介,你会记得用简单的标记符表示的菜谱中的组成成分,如<item>2 cups flour</item>。在写完那篇文章后,我在网上漫游,发现关于菜谱的另一个xml文档。其中的菜谱元素如下所示:


<ingredient quantity="2" units="cups">flour</ingredient>

这种方法有一个实际的好处:可以更容易控制数据。用第一种方法,<item>标记符用来容纳一堆不同的信息。如果我想提取组成成分的清单而不需要各成分的量,我就不会那么做。

我可以用如下的结构取得相似的功能:


<item>flour

<quantity>2</quantity>

<units>cups</units>


这可以被处理,但是有两个问题:首先,item元素包含了混合的内容:文本和其它标记符。我很快就发现应该尽量避免这种结构。其次是标记符几乎没有独立的意义。很难想象只要units而不要实际的组成成分的情况。这些条目可以被简单描述,我宁愿把它们当作属性。

首先要注意的是属性名,quantity和units只有被能够翻译它们的应用程序处理时才有意义。

在被包含在有效的文档中之前,应告诉dtd来允许它。对于上面的ingredient元素,我们在dtd中只包含了以下代码:

 

<!element ingredient #pcdata>

<!attlist ingredient quantity cdata #required>

<!attlist ingredient units cdata #required>


第一行看起来很熟悉 - 在任何dtd中都能看到的标准元素定义。每个attlist行都依次包含以下信息:


<!attlist ingredient quantity cdata #required>

这是属性依附的元素。

<!attlist ingredient quantity cdata #required>

这里定义属性名。

<!attlist ingredient quantity cdata #required>

这里设置属性类型。cdata代表字符数据。意味着处理器在属性内可以得到文本。

<!attlist ingredient quantity cdata #required>

最后的部分定义属性的缺省值。可以使用实际的数值,如3。这样,xml中空白长度的属性值将为3。输入的值将覆盖缺省值。

在上面的例子中我没有设置特定的数量,而是使用xml的关键字#required。它告诉处理器次属性必须包含一个值。如果空白,文档将不被处理。

缺省值有另外两个关键字。第一个是#fixed - 如果属性值在整个文档中保持相同的值。假设我定义一个image的标记符属性,所有图像的大小都相同,比如说100*50像素,就可以在dtd中这样定义属性:


<!attlist picture length cdata #fixed "100 px">

<!attlist picture width cdata #fixed "50 px">

 

另一个关键字是#implied,表示属性可以包含值或是空的。

下面让我们看看属性类型。

如果你决定自己写dtd,可能需要一本解释attlist语句中所有组合的xml的书。但是如果借用dtd,或许只知道cdata和另外三种属性就性了。

第一个是id。它要求属性的值在文档中不重复。使用过数据库的人都知道唯一标志符的必要性。dtd attlist语句看起来象这样:

<!attlist element_name attribute_name id #required>

很难想象没有#required缺省值的id属性类型。如果那样,任何重复的或空的id都会迫使处理器返回一个错误。id必须以字母或下划线开始并且不能包含任何空格。

nmtoken类型也使用上面的命名规则。但是允许重复。它被用做传递数据给应用程序的保障。大多数程序语言,包括java和javascript,在模块名中不能有空格。大多数情况下,最好保证属性符合它们的规则。

最后是枚举类型,不需要特定的关键字。而是用"|"符号包含在括号内的值,例如:

<!attlist sibling (brother | sister) #required>

如果有有限的可能的属性值,可以用这种方式。

不会认为今天的课程无趣吧,那么就接着读吧!

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网