曝光台 注意防骗
网曝天猫店富美金盛家居专营店坑蒙拐骗欺诈消费者
XML 文档。语法分析器的任务就是按固定的序列把所有不同文档组合起来。文档中可包含另一文档,或许这个还包含其他文
档。只要没有递归的文档包含行为(处理器可报告的错误),应用程序就仅能看见一个单一、完整的文档。从本质上说,这
种机制提供客户端嵌入的功能。
对XML 而言,可使用外部通用实体引用的方法,在文档中嵌入另一文档。在DTD 中,可按下述语法结构声明外部引用:
<!ENTITY name SYSTEM "URI">
URI 就是Uniform Resource Identifier,与URL 类似,但允许更加精确的资源链接规范。从理论上说,URI 把资源与其储
存位置分开,所以Web 浏览器可以选择最近的或最空闲的几个镜像几个镜像站点,而无需明确指明该链接。URI 领域的研究
非常活跃,争论激烈,因此在实际应用中和在本书中,URI 就是多用途的URL。
例如,可能想在站点的每个页面中都放置相同的签字块。为明确所见,我们假设签字块为清单9-3 所示的XML 代码,而且假
定可从URL http://metalab.unc.edu/xml/signature.xml.上获得该代码。
清单9-3:XML 签字文件
<?xml version="1.0">
<SIGNATURE>
<COPYRIGHT>1999 Elliotte Rusty Harold</COPYRIGHT>
<EMAIL>elharo@metalab.unc.edu</EMAIL>
</SIGNATURE>
在DTD 中添加如下声明,可把实体引用&SIG;与这个文件联系在一起:
XML 实用大全
第 258 页
<!ENTITY SIG SYSTEM "http://metalab.unc.edu/xml/signature.xml">
也可使用相关的URL。例如:
<!ENTITY SIG SYSTEM "xml/signature.xml">
如果被引用的文件放置于与引用该文件的文件所处的同一目录中,那么仅需使用一文件名进行引用。例如:
<!ENTITY SIG SYSTEM "signature.xml">
利用上述任一种声明,仅需使用&SIG;,就可在文档的任意位置引用签字文件的内容。如清单9-4 中的简单的文档,图9-2
显示的是在Internet Explorer 5.0 中交付的文档。
图9-2 使用外部通用实体引用的文档
清单9-4:SIG 外部通用实体引用
<?xml version="1.0" standalone="no">
<!DOCTYPE DOCUMENT [
<!ELEMENT DOCUMENT (TITLE, SIGNATURE)>
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT COPYRIGHT (#PCDATA)>
<!ELEMENT EMAIL (#PCDATA)>
<!ELEMENT SIGNATURE (COPYRIGHT, EMAIL)>
XML 实用大全
第 259 页
<!ENTITY SIG SYSTEM
"http://metalab.unc.edu/xml/signature.xml"?
]>
</DOCUMENT>
<TITLE>Entity references</TITLE>
&SIG;
</DOCUMENT>
注意外部实体引用的附加作用,因为文件不再完整,所以XML 声明中的standalone 属性值为no。解析文件表明该文件需要
外部文件signature.xml 中的数据。
XML 实用大全
第 260 页
.4 内部参数实体
通用实体成为文档的一部分,而非DTD 的组成成分。通用实体引用仅可用于DTD 中能成为文档组成部分的位置上;通用实体
引用不能插入那些仅为DTD 而非文档内容的文本。然而在DTD 中的实体引用通常是有用的,因此XML 提供了参数实体引用的
手段。
除了如下两个关键处不同,参数实体引用与通用实体引用非常相似:
1.参数实体引用以百分号%开始,而非&符号。
2.参数实体引用仅可在DTD 中出现,而不能位于文档内容中。
参数实体引用在DTD 中声明的方法与通用实体类似,只是在实体名前加一百分号。句法结构如下:
<!ENTITY % name "replacement text">
实体名为实体内容的缩写。读者所见为双引号间的替换文本。例如:
<!ENTITY % ERH "Elliotte Rusty Harold">
<!ENTITY COPY99 "Copyright 1999 %ERH;">
当使用参数实体引用替换通用实体引用后,前文中无法实现的缩写(#PCDATA)变为有效:
<!ENTITY % PCD "(#PCDATA)">
<!ELEMENT ANTIMAL %PCD;>
<!ELEMENT FOOD %PCD;>
在元素间的子元素和属性共享通用列表中呈现参数实体引用的真实值。若替换的文本块较大且使用次数较多,则参数实体引
用用处更大。例如,假设在DTD 声明中有许多层次结构元素,如PARAGRAPH、CELL 和HEADING。每个该类元素都有确定的内
联元素数目,类似PERSON、DEGREE、MODEL、PRODUCT、ANIMAL、INGREDIENT 等等的内部元素。这些元素的声明可能表现为
下述方式:
<!ELEMENT PARAGRAPH
(PERSON | DEGREE | MODEL | PRODUCT | ANTIMAL | INGREDIENT)*>
<!ELEMENT CELL
(PERSON | DEGREE | MODEL | PRODUCT | ANTIMAL | INGREDIENT)*>
<!ELEMENT HEADING
(PERSON | DEGREE | MODEL | PRODUCT | ANTIMAL | INGREDIENT)*>
XML 实用大全
第 261 页
容器元素都有相同的内容。假如创建了一个新元素如EQUATION、CD 或ACCOUNT,则该元素必须声明为所有三个元素的子元
素。若在前两个元素中添加新元素,却忘了在第三个元素中添加,就会引发问题。若元素的数目为30 或者300 个,而非3
个,则问题将成倍增加。
若对每个容器元素不是给出单独的子元素列表,则DTD 的维护将较为简便。替代的方法是子元素列表变为参数实体引用,然
后在每个声明元素声明中应用参数实体引用。例如:
<!ENTITY % inlines
"(PERSON | DEGREE | MODEL | PRODUCT | ANTIMAL | INGREDIENT)*">?
<!ELEMENT PARAGRAPH %inlines;>
<!ELEMENT CELL %inlines;>
<!ELEMENT HEADING %inlines;>
当添加新元素时,仅需简单地改变一个参数实体声明,而勿需改变3 个、30 或300 个元素声明。
中国航空网 www.aero.cn
航空翻译 www.aviation.cn
本文链接地址:
XML实用大全(76)