中文FAQ网络管理员和开发商常见问题
---(文/Batman)
在XML中怎样使用图象文件?图象文件的处理就象链接,所以它们可以用任何支持XLink和XPointer的方法来处理。(见earlier question),包括使用与HTML中图象相同的处理方法,或者使用XML的内嵌(built-in NOTATION)方式和ENTITY机制。链接说明书中给出了很好的处理和激活链接的各种方法,所以你可以有多种选择,例如,当网页下载后图象是否立即显示出来,或者需用户点击鼠标再显示,或者出现在一个单独的窗口中,这些都不需要用scripting来编程处理。但支持哪种图象文件格式是由浏览器制作商决定的: XML本身并无限制。GIF, JPG, TIFF, 和CGM理论上都行。
Peter Murray-Rust指出:GIFs和JPegs适合于位图图象(图象由象素单位组成)。矢量图在W3C的图象处理中提到(见http://www.w3.org/Graphics/Activity)。当标准制定后,我们就可以使用XML文件来传输图象文件。对于许多图形对象来说,这意味着将大大减少图
象下载时间和扫描过程中减少损失。
Bob DuCharme说:XML文件中的实体(entity)都要是能被解释(parsed)的XML。而外部实体 (external entity)既可以是可解释的实体(a parsed entity)(即可解释的XML),也可以是不可解释的实体(unparsed entity)(或其他)。 不可解释的实体(Unparsed entities)可表示图象文件,声音文件,电影文件,或你想表示的文件。但它们只能赋值给一个属性(就象在HTML的Web页中一个位图图象文件要赋值给<img>元素的src属性)。在XML文件中,要在ENTITY的声明中声明这个属性,并且要在ENTITY后加上NOTATION,因为如果这个实体(entity)不是XML,那么XML处理器需要知
道它是什么。例如,在下面的例子中,colliepic实体声明有一个JPEG文件,它用来表示空元素
dog的picfile属性的值。
<xml version="1.0">
<!DOCTYPE dog [
<!NOTATION JPEG SYSTEM "Joint Photographic Experts Group">
<!ENTITY colliepic SYSTEM "lassie.jpg" NDATA JPEG>
<!ELEMENT dog EMPTY>
<!ATTLIST dog picfile ENTITY #REQUIRED>
]>
<dog picfile="colliepic"/>
XLink和XPointer说明书还介绍了其他指向非XML文件(如一个图象文件)的方法。它们对在XML文件中外部实体(external entity)的位置,处理和显示都更加复杂。
D. 面向软件和工具开发商(包括网站管理员和服务器管理员)
D.1 XML的规格说明书在哪里?
在这里 (http://www.w3.org/TR/REC-xml)。 包括EBNF。日语版在(http://www.fxis.co.jp/DMS/sgml/xml/); 西班牙语版见(http://www.ucc.ie/xml/faq-es.html); 朝鲜语见(http://xml.t2000.co.kr/faq/index.html) 和一个使用Java的注释版本见http://www.xml.com/axml/testaxml.htm.
?Eve Maler开发了XML规格说明书专用的DTD和相关文件: 这是一个新版本,有XML,XLink, XPointer, DOM等说明书。注意这个版本与XML1.0不兼容,任何问题或建议请与作者Eve联系。
D.2 `DTDless', `valid',和`well-formed'等术语的含意?
标准SGML使用文件类型定义文件(DTD)来定义某一领域中文件的标识符,元素等。但是编制DTD文件琐碎而又复杂,所以XML文件被设计成既可以带有DTD,也可以没有DTD文件。DTDless
的意思是没有DTD的XML文件,你可以创建自己的标识和元素,但不用在DTD中正式定义。
DTDless文件通过创建元素时对它们直接进行定义。但是当XML应用程序,如一个浏览器遇到 DTDless文件时,因为没有DTD文件告诉浏览器关于这个文件的结构信息,所以DTDless文件的
创建仍需要一些规则来规范。
例如,HTML的<IMG>元素被定义为`EMPTY': 它没有终止标识符。若没有DTD文件,XML应用程序就无法知道该元素是否要有终止标识符。所以`well-formed'文件的概念就相应产生了,它明确定
义每个元素都要有起始和终止标识符,并且在定义空元素(EMPTY element)时概念也明确。
D.2.1 `Well-formed'的XML文件
所有的XML文件都必须是well-formed的:
如果没有使用DTD,那么XML文件要在文件开始时 有独立文件声明(Standalone Document Declaration) (SDD),如下:
<?xml version="1.0" standalone="yes"?>
<foo>
<bar>...<blort/>...</bar>
</foo>
所有的标识符(tags)要前后对应: 即所有元素定义的前后都要有起始和终止标识符。 (除空元素(empty elements)之外不允许省略,见下面说明);
所有的属性值(attribute values)都要在引号中(如果值中已经包含了双引号,可以再用单括号 ,反之也行): 如果你两个都用,使用'和"
所有空元素(EMPTY element)的标识符(tags)(对于那些没有终止标识符 的,如HTML语言中的<IMG>,<HR>,和<BR>等)要在最后加上`/>' 或者加上终止标识符;
如:<BR>可以是<BR/> 或写成<BR></BR>。
在你的文件中不能有(< or &)形式的字符单独出现(而要写成<和&的形式), ]]>要写成]]>的形式。如果它不出现在CDATA类型标识的结尾;
元素标识符的嵌套顺序要正确(与SGML中的规则相同);
没有DTD的Well-formed文件的任何元素都可以设置属性,属性的缺省类型是CDATA。
§ 没有DTD的Well-formed的XML文件认为字符<,>,',",和&都事先定义好了,以供使用,所以没有DTD也能正确解释。而在Valid的XML文件中在使用它
们前要用DTD明确定义。Richard Lander补充,如果你想使用多于5个缺省的字符项,又不想使用DTD 文件的话,可以在其他DTDless文件的内部子集中定义字符项,而文件仍保持standalone='yes':
<?xml version="1.0" standalone="yes"?>
<!doctype example [
<!entity nbsp " ">
]>
<example>
<!-- the rest goes here -->
</example>
D.2.2 Valid的XML文件
Valid的XML文件就象其他的SGML应用程序一样,也使用Document Type Definition (DTD)。它们也应是 well-formed的。
Valid文件象SGML文件一样,开始处要声明一个DTD文件:
<?xml version="1.0"?>
<!DOCTYPE advert SYSTEM "http://www.foo.org/ad.dtd">
<advert>
<headline>...<pic/>...</headline>
<text>...</text>
</advert>
XML规格说明书 中定义了一个用于XML的SGML声明(SGML Declaration for XML),是固定格式的。(这个声明已从规格说明书中删去了,现在这个文件是一个独立的文件)。 XML版的DTD文件要能被XML处理器(XML processor)访问, 或在用户本机上(文件在用户的硬盘上),或通过网络可以访问。你可以把DTD文件的URL地址放在System后面(如上例)。也可以(有些人认为更好)在Public后面加上URL地址,但它应在 System前面处理。如:
<!DOCTYPE advert PUBLIC "-//Foo, Inc//DTD Advertisements//EN" "http://www.foo.org/ad.dtd">
或
<!DOCTYPE advert SYSTEM "http://www.foo.org/ad.dtd">
XML声明的缺省值是VERSION="1.0" 和 ENCODING="UTF-8"。
D.3 SGML和XML还有哪些不同?
§ 最主要的区别在于你怎样写文件类型定义(DTD)。为了简化语法和编程,很大一部分的SGML的标识定义选项被压缩(见略去的特性列表 )。
§一个特殊的定界符(冒号)在名字的定义(namespaces)中被引用,(namespaces使得DTD 能按一定的规则区分元素名,所有权和应用程序)。冒号仅仅出现在名字中间,不在开始也不在
结束。Namespace的定义工作还在进行中。
D.4 现在有哪些XML软件可供使用?
这个问题的答案已在这个FAQ中删去了,因为它们变化得太快以至于无法记录下来。详细的清单请见http://www.oasis-open.org/cover/xml.html。
浏览器软件请见XML浏览器部份的问题和面向软件开发人员的xml-dev mailing list。 Bert Bos收集了一些用bison, flex, perl和Python开发的XML软件工具列表 。
D.5 我需要对服务器软件做一些改变来运行XML吗?
只要使.xml文件符合它的MIME类型(application/xml or text/xml,RFC2376),所以为支持XML,你只要修改mime类型(或相类似的),并加上这一行
application/xml xml XML dtd DTD xsl XSL ent ENT cat CAT sty STY
在某些服务器上(如Apache),为了某些特殊文件类型的使用,用户可以通过一个htaccess
文件来自己修改MIME的类型。因为RFC中的字符集的限制,MIME content-type text/xml只适合于纯ASCII码文件中(ISO 646 IRV)。
因为XML可以支持格式表(stylesheet)和复杂的链接,所以XML文件象SGML文件一样,有一些
附属文件,如: DTDs,实体文件(entity files),目录(catalogs),格式表(stylesheets)等等。可能这些文件是其他类型的MIME Content-Type entries,需要被放置在合适的目录中。 XUA(XML User Agent)是一个XML工作组计划完成的项目,它能提供一种把XML文件和XSL层叠表包装成一个单独的消息的机制。
如果你用scripts来生成XML版的HTML文件,它们需要被修改成能产生相关的文件类型的文件。
D.6 我仍然能使用服务器端的INCLUDEs吗?
是的,只要能生成符合XML的文件(或是valid,或是 well-formed的)。
D.7 我仍然能使用客户端的INCLUDEs吗?
与服务器端INCLUDEs相同。你要保证所有的要经过第三方引擎(third-party engine),即由其他软件商开发的单独的应用程序(如SDQL enquiries, Java writes, LiveWire requests, streamed content等等)解释的代码中都不能包含能产生错误的符号(例如尖括号或“&”): 或者用CDATA,避免XML应用程序来解释代码(embedded code),或使用标准的<, > 和&字符代替。
D.8 我研究了一下XML的规格说明书: 为什么SGML(和XML) 有这么多复杂的术语?
为了概念能连续下去,术语的定义要精确。
例如: "元素"(`element')和"标识"(`tag')不是同义词: 元素(element)是带标识符的信息的基本单位,可以只包括一个起始标识符(象HTML中的<BR>),或者包括一个起始标识符和一个终止标识符以及它们之间的内容;而标识 (tags)本身是在元素开始和结束时的标志。
术语概念模糊不清会引起读者的误解,所以正式的标准中要使用正式定义过的术语。本文不属于正式的标准,所以聪明的读者也许已经发现,有时说"元素名"(`element names'),实际上应 该说"元素类型名"(`element type names')更合适; 但是前者更容易被理解。
SGML的初学者可以阅读一下TEI中的SGML基本知识介绍章节。
D.9 有没有一个面向XML的API(应用程序接口)工具箱?
有几个已经存在,有些正在开发中。有关这方面的介绍和其他XML软件请见SGML/XML大全http://
语言科技组(The Language Technology Group)开发了LT XML toolkit,见 (http://www.ltg.ed.ac.uk/software/xml/)和DSSSL语法检查器(DSC: http://www.ltg.ed.ac.uk/~ht/dsc-blurb.html).
[任何人知道其他有关信息,请通知我。]
大型SGML转换工具和应用程序开发引擎(application development engines),如Balise, Omnimark和SGMLC都正在开发支持XML的版本。各种SGML软件请见the SGML Web pages。
D.10 XML怎样符合DOM?
Michael Dyck说:文件对象模型(Document Object Model(DOM))http://www.w3.org/TR/PR-DOM-Level-1) 提供了一个建立,访问和编辑XML和HTML文件的抽象的API。对应某种编程语言的一组DOM则提供了
一个具体的API。
D.11 有没有一个对XML处理器的一致性测试(即测试XML文件是否符合DTD中的定义)?
James Clark收集了用来测试XML解释器的例子,见http://www.jclark.com/xml/ ,其中包含了一个一致性测试(conformance test)。
D.12 我怎样把一个DTD文件(或一部分)插入另一个中?
这和在标准SGML中的处理过程一样。首先你要声明要引用的实体(entity),然后附上实体名:
<!ENTITY % mylists PUBLIC
"-//Foo, Inc//ENTITIES Common list structures//EN"
"dtds/listfrag.ent">
...
%mylists;
这种声明一般集中列在主DTD文件的开始处,方便修改和维护,但是这种方法不是唯一的。你也可以使用参数项语法 (parameter entity syntax)来处理,因为DTD文件只有在被编译时才被调用,而不是在解释时被调用。
注意XML中所有的外部文件(external file)都要有一个URL地址: 使用URL的一般表达方式(给出文件所在的服务器,目录)。URL地址也可以在System之后,如:
<!ENTITY mydtd SYSTEM "http://www.foo.bar/~blort/my.dtd">
或作为Public Identifier后的第二个参数,如上例中。
D.13 我有SGML的DTD,怎样转换才能应用于XML中?
现在很多把常用的SGML的DTD文件转换为XML格式的工作正在进行。(例如Patrice Bonhomme正在转换一个TEI Lite DTD文件: 详情见TEI-L mailing list)。
下面的列表来自于Se 膦n McGrath(XML例子开发者):
不同于SGML的声明。关键字,字符集等等都是基本上固定的;
标识符Tag的省略是不允许的,所以<!ELEMENT x - O (A,B)>改为 <!ELEMENT X (A,B)> and <!ELEMENT x - O EMPTY>改为becomes <!ELEMENT X EMPTY>;
#PCDATA只能出现在"|"符号(OR model)的最左端,如<!ELEMENT x (A|B|#PCDATA|C)>改为 <!ELEMENT x (#PCDATA|A|B|C)> <!ELEMENT x (A,#PCDATA)>是错误的;
没有CDATA, RCDATA元素(elements);
有些SGML属性类型(attribute types)在XML中不允许,如NUTOKEN。 而且没有NOTATION属性(data attributes);
有些SGML属性的缺省值在XML中不允许,如CONREF;
Comments不能在同一行中声明,象<!ELEMENT x (A,B) -- this is an SGML comment in a declaration -->是不合法的, 而在标准SGML中可以;
许多SGML的特性(optional features)在XML中不允许: a)所有形式的标识符省略(OMITTAG, DATATAG, SHORTREF等等); b)链接处理定义; c)多个DTDs文件等等,其他更完整的列表见: SGML中被XML略去的部分的问题;
最后的也是很重要的一点, CONCUR! XML文件的内部DTD(internal subset portion)和外部 DTD(external subset portion)有很重要的区别: a) 标识的部分只在外部DTD中 b)在内部DTD 中,参数项(Parameter Entities)要代替整个声明部份,如下面这个文件是不合法的XML文件:
<!DOCTYPE x [
<!ENTITY % modelx "(A|B)*">
<!ELEMENT x %modelx;>
]>
<x></x>
D.14 XML和EDI之间的关系?
电子文件交换EDI(Electronic Document Interchange)用于商业伙伴之间交换,传送信息已经好几年了。它使用专门的软件,但是现在都逐步转向使用XML来传送EDI数据。详情见http://www.xmledi.com/,一个在线指导文件见http://www.geocities.com/WallStreet/Floor/5815/guide.htm。