声明:《本文是j2ee1.4 tutorial的中文翻译,由于本人水平有限,其中还包含有很多的错误,还希望各位大虾帮助改正,翻译正在进行中,我会陆续发表最新的部分,望大家能给与支持!》
产生XML数据
这部分将带着你一步步的走进创建XML文档的过程。沿着这个方向,你将获得对XML组件的体验。
编写一个简单的XML文件
你将从编写一个幻灯演示的XML文件开始。在这个练习中,你将使用你的文本编辑器来产生数据,这样可以使你舒适的了解XML文件的基本格式。
产生文件
使用一个标准的文本编辑器,产生一个文件sideSample.xml
编写声明
下一步,写一个声明,它能使处理程序将这个文件识别为XML文件。这个声明开始与字符“<?”,这个符号是标准的XML的处理指令标识符。
<?xml version='1.0' encoding='utf-8'?>
这行识别这个文档为XML文档,它使用了1。0版本的XML规范,文档使用的字符编码识8位Unicode字符编码方案。
因为这个文档没有被指定为“独立的”,所以分析器会假定它可能包含对其他文档的引用。
增加一个注释
注释可以被分析器忽略。一个程序实际上是看不到它的,除非你激活分析其中指定的设定。向文件中增加一个粗体的文本。
<?xml version='1.0' encoding='utf-8'?>
<!-- A SAMPLE set of slides -->
定义根元素
在声明后,每个XML文件都要确切的定义一个根元素。文件中任何其他的元素被包含在根元素中。向文件输入下面粗体的文本。
<?xml version='1.0' encoding='utf-8'?>
<!-- A SAMPLE set of slides -->
<slideshow>
</slideshow>
注意:XML元素的名称是大小写敏感的。结束标志必须匹配开识标志。
向一个元素中增加属性
一个幻灯显示含有很多相关联的数据条目,这些数据条目不需要任何的结构。所以可以自然的将他们定义成slideshow的属性。增加粗体文本到文件中来建立属性。
...
<slideshow
title="Sample Slide Show"
date="Date of publication"
author="Yours Truly"
>
</slideshow>
但你产生一个标记名称或一个属性的时候,你能使用连号(“-”),下滑线(“_”),冒号(“:”)和句号(“.”)加上字符和数字。与Html不同的是,XML属性值总是在双引号中,多个属性之间不能被都好分隔。
注意: 冒号需要被小心使用或完全的不使用,因为他们在定义命名空间使会使用到。
增加嵌套的元素
XML允许层次结构的数据,也就是说一个元素能够包含其他的元素。增加下面的粗体文本来定义一个幻灯元素,在幻灯元素包含一个<title>元素。
<slideshow
...
>
<!-- TITLE SLIDE -->
<slide type="all">
<title>Wake up to WonderWidgets!</title>
</slide>
</slideshow>
在这里, slide元素里包含一个type属性。这个属性的意义是这个幻灯片能够为一个主要的技术或主要的执行人打上标记。
更重要的是,尽管这个例子举例说明了属性与元素之间的不同。Title元素是观众能够看到的,所以它是一个元素。另一方面,不需要被观众看到的类型就成为属性。可以从另一个方面来想这个区别:元素是一个容器,像一个瓶子。属性就是这个容器的特点。
增加HTML样式的文本
既然XML允许你定义任意想要的标记,那么你完全可以定义一个类似HTML的标记集。实际上,XHTML标准就做这些工作。你将看到多关于SAX的说明。目前,下面的粗体文本定义了一个使用HTML样式的幻灯。
...
<!-- TITLE SLIDE -->
<slide type="all">
<title>Wake up to WonderWidgets!</title>
</slide>
<!-- OVERVIEW -->
<slide type="all">
<title>Overview</title>
<item>Why <em>WonderWidgets</em> are great</item>
<item>Who <em>buys</em> WonderWidgets</item>
</slide>
</slideshow>
注意:一个title元素和XHTML中的元素会发生冲突,因为他们有同样的名字。我们将讨论产生冲突的机制。
增加一个空元素
在HTML和XML之间的一个主要的不同时所有的XML必须是格式良好的,也就是说,每一个标记必须有结束标记。使用一个结束标记会让你感觉非常的舒服。到现在为止,增加下面的粗体文本来增加一个空元素。
...
<!-- OVERVIEW -->
<slide type="all">
<title>Overview</title>
<item>Why <em>WonderWidgets</em> are great</item>
<item/>
<item>Who <em>buys</em> WonderWidgets</item>
</slide>
</slideshow>
注意:任何元素可能是空元素。
注意:另外一个格式良好的因素是正确的嵌套。所以<b><i>some_text</i></b> 是格式良好的。而下面的就不是<b><i>some_text</b></i>.
完成的产品
下面是XML文件完成的版本:
<?xml version='1.0' encoding='utf-8'?>
<!-- A SAMPLE set of slides -->
<slideshow
title="Sample Slide Show"
date="Date of publication"
author="Yours Truly"
>
<!-- TITLE SLIDE -->
<slide type="all">
<title>Wake up to WonderWidgets!</title>
</slide>
<!-- OVERVIEW -->
<slide type="all">
<title>Overview</title>
<item>Why <em>WonderWidgets</em> are great</item>
<item/>
<item>Who <em>buys</em> WonderWidgets</item>
</slide
</slideshow>
编写处理指令
有时在XML数据中包含处理指令是非常有意义的。在这个练习中,你将增加一个处理指令到你的slideSample.xml文件中。
和你在处理指令这章看到的一样,处理指令的格式是<?target data?>,其中“target”是目标应用程序,“data”是指令或信息。增加下面的粗体文本到文件中,这段文本为一个虚构的幻灯演示增加了一个处理指令。这个指令的功能是询问用户要显示哪一个片断(技术、执行级或所有)。
<slideshow
...
>
<!-- PROCESSING INSTRUCTION -->
<?my.presentation.Program QUERY="exec, tech, all"?>
<!-- TITLE SLIDE -->
注意:
1. “data”部分(处理指令部分)能够包含空格或可以为空。但是在<?和target标记之间不能有任何的空格。
2. “data”部分在第一个空格后开始。
3. 用完全的独一无二的包路径来限定“target”,这样排除了和处理同样数据的其他场序冲突的可能性。
4. 为了易读性,在应用程序名称后包含一个“:”是一个不错的注意,像下面那样:
<?my.presentation.Program: QUERY="..."?>
冒号使得target名成为一种“标签”。然而,当w3c规范允许冒号出现在target名称中时,一些IE5版本会认为这是一个错误。在本指南中,我们会避免在target名称中使用冒号。
保存这个文件为slideSample02.xml。
错误的介绍
分析其可能产生三种错误:致命错误、错误和警告。在本练习中,你将对XML文件做一些小的修改来产生一个致命的错误。
一个简单的方法可以用来产生一个致命的错误,移除空元素“item”后面的“”,这样就产生一个没有结束标记的标记了。这是就会产生一个致命错误,因为没有结束标记的标记不是格式良好的。按照下面去做:
1. 拷贝slideSample02.xml到slideSampleBad1.xml
2. 编辑slideSampleBad1.xml并且像下面那样移除字符
<!-- OVERVIEW -->
<slide type="all">
<title>Overview</title>
<item>Why <em>WonderWidgets</em> are great</item>
<item/>
<item>Who <em>buys</em> WonderWidgets</item>
</slide>
变成:
...
<item>Why <em>WonderWidgets</em> are great</item>
<item>
<item>Who <em>buys</em> WonderWidgets</item>
...
现在你就有了一个可以产生错误的文件。XML分析器被用来产生这个错误。
取代和插入文本
在这部分,你将学到:
1. 处理特殊字符(“<”,“&”等)
2. 处理XML样式语法的文本。
处理特殊字符
在XML中,一个实体是一个XML结构(或文本),它拥有一个名称。通过名字引用实体导致实体被插入文档取代这个实体引用。为了产生一个实体引用,实体名称被“&”记号标记,如下:
&entityName;
当你学习怎样编写一个DTD的时候,你将看到你能够定义自己的实体。这样,你可以将你的实体扩张到所有的文本。尽管到现在为止,我们只是将焦点放在预定义实体。
Table 2-1 Predefined Entities
Character Reference
& &
< <
> >
" "
' '
字符引用
一个字符应用,像 包含一个井号标记。其中的数字是一个单一字符的Unicode的整数值,例如“A”的值是65,147代表的字符是左引号,148代表右引号。
在一个XML文档中使用一个实体引用
假设你想在你的XML文档中插入一行:
Market Size < predicted
直接将这行插入XML文件中的问题是:当分析器看到左尖括号(<),它就开始查找标识名。为了避开这个问题,你可以用< 代替<
将下面的粗体文本加入文件slideSample.xml。保存一个备份,名字叫slideSample03.xml
<!-- OVERVIEW -->
<slide type="all">
<title>Overview</title>
...
</slide>
<slide type="exec">
<title>Financial Forecast</title>
<item>Market Size < predicted</item>
<item>Anticipated Penetration</item>
<item>EXPected Revenues</item>
<item>Profit Margin </item>
</slide>
</slideshow>
当你使用一个XML分析器得到数据是,你将期望如下的输出:
Market Size < predicted
你看到一个左尖括号(“<”)代替了“<”,因为XML分析器会自动将实体代替实体引用。
以XML样式语法处理文本
当你正在操作一大块XML或HTML(其中可能包括很多的特殊字符)时,用实体引用代替每一个特殊符号是很不方便的。对于这种情况,你可以使用CDATA。
一个CDATA就好像HTML中的<pre>…</pre>一样,在它里面的数据不会被当作XML编译。一个CDATA开始与<![CDATA[,结束于]]>。
增加下面的粗体文本到slideSample.xml中,并保存一个副本,名称为:slideSample04.xml
...
<slide type="tech">
<title>How it Works</title>
<item>First we fozzle the frobmorten</item>
<item>Then we framboze the staten</item>
<item>Finally, we frenzle the fuznaten</item>
<item><![CDATA[Diagram:
frobmorten <--------------- fuznaten
<3> ^
<1> <1> = fozzle
V <2> = framboze
Staten--------------------+ <3> = frenzle
<2>
]]></item>
</slide>
</slideshow>
当你回显CDATA部分的数据时,你会发现显示出来的和你写进取得没有区别。因为分析器不会将这里面的数据当作XML来处理,所以,他们不会产生致命的错误。
产生一个类型定义文档(Document Type Definition)
在XML声明之后,文档序能够包含一个DTD,这个DTD让你指定文档中包含的标识的种类。除了告诉一个合法的分析器标识合法性和标识的布局外,它还告诉合法的或不合法的分析器哪里是文本,使得分析器决定是否空格时重要的还是可以被忽略的。
基本DTD定义
为了开始学习DTD的定义,让我们通过告诉分析器哪里的文本是被期望出现的和哪里的文本会造成错误。
我们通过产生一个文件,名称为slideshow.dtd来开始。进入一个声明和一个注释来分析这个文件。像下面所显示的那样:
<?xml version='1.0' encoding='utf-8'?>
<!--
DTD for a simple "slide show".
-->
下一步,增加下面粗体文本到文件:
<!-- DTD for a simple "slide show". -->
<!ELEMENT slideshow (slide+)>
像你看到的那样,这个DTD标识开始于<!,后面跟随着标是名称(ELEMENT)。在这个标识名称后识被定义的元素名称。后面的园括弧里面的内容代表着一个或一个以上的slide元素出现在slideshow里都是合法的。
如果没有和面的加号,那么这个定义代表slideshow只能包含一个slide元素。下面列出了所有的限定符号。
Table 2-2 DTD Element Qualifiers
Qualifier Name Meaning
? Question Mark Optional (zero or one)
* Asterisk Zero or more
+ Plus Sign One or more
你能够包含更多的元素通过使用逗号和在每一个元素上使用限定符。你也能够使用嵌套来组织多个条目。例如,在定义一个image元素后,你能够声明每个image元素必须与一个title元素匹配,通过指定((image, title)+)。在这里,加号是应用于image/title对,表明一个或多个指定条目对可能出现。
定义文本和嵌套元素
现在,你可以告诉分析器在那里不要出现文本。让我们看看怎样告诉它。增加下面的粗体文本到文件。
<!ELEMENT slideshow (slide+)>
<!ELEMENT slide (title, item*)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT item (#PCDATA item)* >
你增加的第一行意思是一个slide由一个title组成或由一个title和多个item组成。下一行的意思是一个title完全的由分析字符数据(PCDATA)组成。在PCDATA前面增加“#”表明后面跟随得是一个特殊单词而不是一个元素名称。
最好一行引入了垂直条(),它表明“或”的条件。所以最后一行代表item或是PCDATA或是item。最好的星号表明发生0次或多次。这个规范的结果被认为是一个“混合内容模型”,因为任意数量的item元素可以出现在文本中。
保存这个DTD为slideSample1a.dtd。
DTD的限制
如果你能指定一个item或者可以包含文本或者可以包含文本和更多的item,那将会更好。但是,DTD规范让这种转变很困难。例如,你可以试着定义一个item,如下:
<!ELEMENT item (#PCDATA (#PCDATA, item+)) >
这样做当然是符合上面的条件的,但是一旦分析器看到#PCDATA和垂直杠,它就需要后面的定义来符合这个混合内容模型。这个规范不允许这样定义,所以你会得到一个错误:Illegal mixed content model for ‘item’. Found (…, 上面的十六进制28是定义的邮件括号。
两次定义这个item元素也不行。一个像下面一样的规范:
<!ELEMENT item (#PCDATA) >
<!ELEMENT item (#PCDATA, item+) >
会产生一个“duplicate definition”警告,事实上,第二个定义会被忽略掉。所以我们能做到最好就是定义一个混合文档模型(允许item可以在文本中散布)了。
除了上面提到的混合文档模型的限制,我们也没有办法来限定文档的种类。它应该仅仅包含数字嘛?是一个日期型或是一个货币型嘛?在DTD中,我们没法实现这种限定。
最后,注意,DTD是层次不敏感的。title元素应用的定义等价于一个silde title和一个item title。当我们扩展DTD,是DTD除了允许文本外,我们还允许HTML风格的标签时,那么一个item title的size和一个slide title的size的必须区分开来。例如,你几乎只有一种方法区分他们,那就是赋予他们不同的名字,如“item_title”。所有的这些限制是概要规范标准的开发背景。
在DTD中指定元素值
比指定一个加括弧的元素列表更好的方式是:元素的定义可以使用一些指定的值:ANY或EMPTY。ANY规范的意思是元素可以包含任何定义的元素或PCDATA。这样一个规范通常针对一个通用目的的XML文档的根元素的使用,例如你可以使用一个字符处理器产生它。
EMPTY规范的意思是元素不包含内容。所以一个E-MAIL的DTD中的<flag/>可以这样使用:
<!ELEMENT flag EMPTY>
引用DTD
在这个例子中,DTD定义是一个单独的文件。也就是说你不得不在XML文档中引用它。一回你将会看到,在文档的范围内,你也可以包含DTD的一部分。这些定义构成了DTD的本地子集。
为了引用DTD文件,你只需要增加下面组体的文本到你的slideSample.xml文件中,并且以slideSample05.xml文件名保存它。
<!-- A SAMPLE set of slides -->
<!DOCTYPE slideshow SYSTEM "slideshow.dtd">
<slideshow
DTD标记开始于“<!”。在这个例子中,这个标记名“DOCTYPE”的意思是这个文档是“slideshow”,“slideshow”得意思是这个文档由slideshow元素和所有包含在slideshow内的内容组成。
<slideshow>
...
</slideshow>
这个标识定义slideshow元素为文档的根元素。一个XML文档有且仅有一个根元素。在这个地方,根元素被指定。换句话说,这个标识将文档内容识别为一个slideshow。
这个DOCTYPE标识在XML定义者后,跟元素之前出现。SYSTEM识别符指定DTD文件的位置。因为它没有以一个前缀(如:http:/或file:/)开始,这个路径是相对于XML文档的。还记得setDocumentLocator这个方法吗?分析器就使用它的信息来找到DTD文件。正像
你的应用程序将找到一个和你的XML文档相关联的文件。一个PUBLIC识别符通过使用一个唯一的名称也能够被用来指定一个DTD文件。但是分析器将不得不解决它。
DOCTYPE规范也能够包含DTD定义。这样的定义将包含在方括号中,如下:
<!DOCTYPE slideshow SYSTEM "slideshow1.dtd" [
...local subset definitions here...
]>
在稍后定义文档中使用的实体时,你将利用这个便利。
文档和数据
以前,你学习XML是因为你听说过XML,一方面是XML数据,另一方面是XML操作是舒适的、结构中部依赖于文本的。
在这个例子文件中,slideshow元素是一个数据元素的例子?它没涉及文本而仅仅包含了子元素。另一方面,Item元素可以被称为文档元素,因为它的定义包含了文本和子元素。
当你浏览完本指南时,你将发现怎样扩展title元素的定义,是它能包含HTML风格的元素。
在DTD中定义属性和实体
到目前为止,你已经定义的DTD可以非常好的使用。他告诉你那里需要文本,那里不需要,这些是分析器特别关注的。但是为了在一个合法分析器中使用,DTD需要为不同的元素指定合法的属性。你将在这部分完成这项工作。在这部分以后,你将定义一个内部的实体和一个外部的实体(通过将它引用进XML文件)。
在DTD中定义属性
让我们通过为幻灯片中的元素定义属性开始这部分。
增加下面粗体的文本到文件中。
<!ELEMENT slideshow (slide+)>
<!ATTLIST slideshow
title CDATA #REQUIRED
date CDATA #IMPLIED
author CDATA "unknown"
>
<!ELEMENT slide (title, item*)>
DTD标记ATTLIST是定义属性的开始标记。紧跟ATTLIST后面的名称指定属性定义的对象。在这个例子中,定义对象是slideshow元素(注意,DTD是缺乏层次的)
每一个属性是由三个空格分开的一系列值构成的。逗号和其他的分隔符是不允许出现的,所以像上面那样格式化定义是有帮助的和易读的。每一行的第一个元素是属性名称:title,date或author。第二个元素表明数据类型:CDATA是字符数据类型。Table 2-3介绍了所有的合法使用的属性类型。
Table 2-3 Attribute Types
Attribute Type Specifies...
(value1 value2 ...) A list of values separated by vertical bars. (Example below)
CDATA "Unparsed character data". (For normal people, a text string.)
ID A name that no other ID attribute shares.
IDREF A reference to an ID defined elsewhere in the document.
IDREFS A space-separated list containing one or more ID references.
ENTITY The name of an entity defined in the DTD.
ENTITIES A space-separated list of entities.
NMTOKEN A valid XML name composed of letters, numbers, hyphens, underscores, and colons.
NMTOKENS A space-separated list of names.
NOTATION The name of a DTD-specified notation, which describes a non-XML data format, such as those used for image files.*
这是一个很快就会过时的规范,在这章里,它将会被讨论。
当属性类型有加括弧的可选列表构成时,这个属性必须使用指定之中的一个。例如,增加粗体文本到文件中:
<!ELEMENT slide (title, item*)>
<!ATTLIST slide
type (tech exec all) #IMPLIED
>
<!ELEMENT title (#PCDATA)>
<!ELEMENT item (#PCDATA item)* >
这个规范的意思是slide元素的type属性必须被赋予“tech”,“exec”或“all”三个属性值。其他的值都不被接受。
属性中最后的一个实体规范决定属性的默认值。. Table 2-4中显示了可能的选择值。
Table 2-4 Attribute-Specification Parameters
Specification Specifies...
#REQUIRED The attribute value must be specified in the document.
#IMPLIED The value need not be specified in the document. If it isn't, the application will have a default value it uses.
"defaultValue" The default value to use, if a value is not specified in the document.
#FIXED "fixedValue" The value to use. If the document specifies any value at all, it must be the same.
最后,保存一个DTD的副本到slideshowlb.dtd文件。
在DTD中定义实体
到目前为止,你已经接触到了预定义的实体,像&。你已经接触到了一个属性能够引用一个实体。现在到让你学习定义自己的实体的时候了。
增加下面粗体的文本到你的XML文件中:
<!DOCTYPE slideshow SYSTEM "slideshow.dtd" [
<!ENTITY product "WonderWidget">
<!ENTITY products "WonderWidgets">
]>
ENTITY标记名称意思是说你正在定义一个实体。后面跟着实体的名称和它的定义。在这个例子中,你正在定义一个实体,名称是“product”,它的实体值将取代文本中的实体名。
最后的部分是取代字符串,无论在文档中的什么位置引用实体名,它将取代实体名称。这个取代字符串使用引号定义。
现在,你已经定义了实体,下一步是引用他们。在粗体的文本上作一些改变:
<slideshow
title="WonderWidget&product; Slide Show"
...
<!-- TITLE SLIDE -->
<slide type="all">
<title>Wake up to WonderWidgets&products;!</title>
</slide>
<!-- OVERVIEW -->
<slide type="all">
<title>Overview</title>
<item>Why <em>WonderWidgets&products;</em> are
great</item>
<item/>
<item>Who <em>buys</em> WonderWidgets&products;</item>
</slide>
值得注意的是,在这里,你的实体的引用使用的是和预定义使用的语法相同(&entityName;),这个实体可以在属性中和元素内容中被引用。
当你从分析器中得到这个文件的回馈,你会看到:
Wake up to WonderWidgets!
注意,这个product名称已经被实体的引用值代替。
保存这个文件的一个拷贝到slideSample06.xml
额外的有用的实体
这里有几个实体定义的例子,当你编写XML文档时,你会发现她很有用。
<!ENTITY ldquo ""> <!-- Left Double Quote -->
<!ENTITY rdquo ""> <!-- Right Double Quote -->
<!ENTITY trade ""> <!-- Trademark Symbol (TM) -->
<!ENTITY rtrade "®"> <!-- Registered Trademark (R) -->
<!ENTITY copyr "©"> <!-- Copyright Symbol -->
外部实体的引用
你能够使用SYSTEM或PUBLIC识别符指定一个外部实体。
为了引用一个外部实体,增加下面粗提到文件中:
<!DOCTYPE slideshow SYSTEM "slideshow.dtd" [
<!ENTITY product "WonderWidget">
<!ENTITY products "WonderWidgets">
<!ENTITY copyright SYSTEM "copyright.xml">
]>
这个定义引用一个版权信息,它包含在“copyright.xml”文件中。产生一个文件,输入一些感兴趣的内容,可能像下面那样:
<!-- A SAMPLE copyright -->
This is the standard copyright message that our lawyers
make us put everywhere so we don't have to shell out a
million bucks every time someone spills hot coffee in their
lap...
最后,增加下面粗体的文本到你的slideSample.xml文件中来引用这个外部的实体。保存这个文件到slideSample07.xml
<!-- TITLE SLIDE -->
...
</slide>
<!-- COPYRIGHT SLIDE -->
<slide type="all">
<item>©right;</item>
</slide>
你也能够使用一个外部的实体声明来访问一个servlet。这个servlet产生目前的日期:
<!ENTITY currentDate SYSTEM
"http://www.example.com/servlet/CurrentDate?fmt=dd-MMM-
yyyy">
你将像引用其他的实体一样引用它。
Today's date is ¤tDate;.
你将看到如下的回馈:
...
<slide type="all">
<item>
This is the standard copyright message that our lawyers
make us put everywhere so we don't have to shell out a
million bucks every time someone spills hot coffee in their
lap...
</item>
</slide>
...
你将注意到注释后面的新行所谓一个字符被回馈,但是这个注释本事被忽略。
总结
在文档中引用的一个实体,无论它是内部的还是外部的,都被称作普通实体。一个包含在DTD规范中的实体被称为参数实体。
一个包含XML(文本或标记)的实体,它会被分析器分析,所以称作被分析的实体。一个包含二进制数据(像图像)的实体被称为非分析实体。在本指南的下一部分我们将讨论非分析的实体的引用。
引用二进制实体
这部分讨论引用二进制数据文件的选择。
使用一个MIME数据类型
有两种方法可以引用一个非分析实体,如二进制图像文件。一个是使用DTD的NOTATION规范机制。然而,这个机制复杂的、不够初步的,它主要为了和SGML文档的兼用性而存在。当我们看DTDHandler API时,我们将有机会深层次的讨论它。
要建立使用图像文件的slideshow,增加下面粗体文本到你的slideshowlb.dtd文件:
<!ELEMENT slide (image?, title, item*)>
<!ATTLIST slide
type (tech exec all) #IMPLIED
>
<!ELEMENT title (#PCDATA)>
<!ELEMENT item (#PCDATA item)* >
<!ELEMENT image EMPTY>
<!ATTLIST image
alt CDATA #IMPLIED
src CDATA #REQUIRED
type CDATA "image/gif"
>
这些修改声明image为一个可选的元素。这个image标识模仿HTML4。0标识。它有一个“隐含的”值,它意味着它是可选的,程序处理这段数据可以获得充分的替代,像“image no found”。另一方面,src属性是必需的。
在文档里,到一个名称是“intro-pic”的image的引用可能像下面这样:
<image src="http://www.QQread.com/j2ee/image/intro-pic.gif", alt="Intro Pic",
type="image/gif" />
选择:使用实体引用
使用一个MIME数据类型作为一个元素的属性是一个机制,它是灵活的和可扩展的。要产生一个外部的ENTITY引用使用符号机制,你需要针对jpeg和gif数据的DTD NOTATION元素。
。
。
。
《由于水平所限,后面关于XML的部分暂时省略》
(出处:http://www.knowsky.com)