如同我在第六章中介绍的,你可以使用未解析实体宣告来将外部数据文件合并至XML 文件中。(所有未解析实体都是以一般外部形态存在。)使用未解析实体的方法,是将实体名称指定到具有ENTITY 或ENTITIES 形态的属性中,作为将外部实体档案与特定的XML 元素结合在一起的方法。XML 处理器并不会存取未解析实体档案。更确切的说,是XML 处理器仅仅让应用程序可以获得实体的描述与卷标,而应用程序则是可以适当地取得并使用这些信息。
本节中提出一个XML 文件和HTML 网页,来显示使用DOM 从XML 文件来撷取实体的数据与描述实体格式卷标的基本步骤。列表9-7 包含了XML 的范例文件,而列表9-8 包含了HTML 的范例网页。(你可在随书光盘的 Inventory Entity.xml 和 Inventory Entity.htm 档案中找到这两份列表。)
Inventory Entity.xml
<?xml version="1.0"?>
<!--File Name:Inventory Entity.xml -->
<!DOCTYPE INVENTORY
[
<!NOTATION TXT SYSTEM "plain text file">
<!ENTITY rev_huck SYSTEM "Review of Huckleberry Finn.txt"
NDATA TXT>
<!ENTITY rev_leaves SYSTEM "Review of Leaves of Grass.txt"
NDATA TXT>
<!ENTITY rev_legend SYSTEM "Review of Sleepy Hollow.txt"
NDATA TXT>
<!ELEMENT INVENTORY (BOOK)*>
<!ELEMENT BOOK (TITLE,AUTHOR,BINDING,PAGES,PRICE)>
<!ATTLIST BOOK Review ENTITY #IMPLIED>
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT AUTHOR (#PCDATA)>
<!ELEMENT BINDING (#PCDATA)>
<!ELEMENT PAGES (#PCDATA)>
<!ELEMENT PRICE (#PCDATA)>
]
>
<INVENTORY>
<BOOK Review="rev_huck">
<TITLE>The Adventures of Huckleberry Finn</TITLE>
<AUTHOR>Mark Twain</AUTHOR>
<BINDING>mass market paperback</BINDING>
<PAGES>298</PAGES>
<PRICE>$5.49</PRICE>
</BOOK>
<BOOK Review="rev_leaves">
<TITLE>Leaves of Grass</TITLE>
<AUTHOR>Walt Whitman</AUTHOR>
<BINDING>hardcover</BINDING>
<PAGES>462</PAGES>
<PRICE>$7.75</PRICE>
</BOOK>
<BOOK Review="rev_legend">
<TITLE>The Legend of Sleepy Hollow</TITLE>
<AUTHOR>Washington Irving</AUTHOR>
<BINDING>mass market paperback</BINDING>
<PAGES>98</PAGES>
<PRICE>$2.95</PRICE>
</BOOK>
</INVENTORY>
列表9-7.
Inventory Entity.htm
<!--File Name:Inventory Entity.htm -->
<HTML>
<HEAD>
<TITLE>Get Entity Information</TITLE>
<SCRIPT LANGUAGE="JavaScrip" FOR="window" EVENT="ONLOAD">
Document =dsoInventory.XMLDocument;
Attribute =
Document.documentElement.childNodes(0).attributes(0);
if (Attribute.dataType =="entity")
{
DisplayText ="''" ++Attribute.nodeName
+"''attribute has ENTITY type" ++"\n";
DisplayText +="attribute value ="
+Attribute.nodeValue +"\n";
Entity =
Document.doctype.entities.getNamedItem(Attribute.nodeValue);
DisplayText +="entity file ="
+Entity.attributes.getNamedItem("SYSTEM").nodeValue
+"\n";
NotationName =
Entity.attributes.getNamedItem("NDATA").nodeValue;
DisplayText +="entity notation =" ++NotationName +"\n";
Notation =
Document.doctype.notations.getNamedItem(NotationName);
DisplayText +="notation URI or description ="
+Notation.attributes.getNamedItem("SYSTEM
").nodeValue
+"\n";
alert (DisplayText);
location.href =
Entity.attributes.getNamedItem("SYSTEM
").nodeValue;
}
</SCRIPT>
</HEAD>
<BODY>
<XML ID="dsoInventory" src=http://www.ddvip.com/web/xml/index1/"Inventory Entity.xml"></XML>
</BODY>
</HTML>
在范例XML 文件中的每个BOOK 元素,包含了一个名为Review 的ENTITY 型态属性,此属性被指定成一个包含特定书籍数据的未解析实体。范例HTML 网页中包含一份script,显示了当DOM script 遇到拥有ENTITY 或ENTITIES 形态的属性时,所必须执行的基本步骤,以撷取所有关于实体的信息。特别是,script 撷取被指定到Review 属性的未解析实体信息,而Review属性位于文件中第一个BOOK 元素中。未解析实体的信息结果由「警告」消息框显示如下:
下面是script 程序执行的基本步骤的简介:
1. script 得到位于第一个BOOK 元素中代表Review 属性的Attribute 节点:
2. Attribute =Document.documentElement.childNodes(0).attributes(0);
3. script 使用dataType 节点属性(参考 表格9-2 ),来判断此属性是否具有ENTITY形态:
4. if (Attribute.dataType =="entity")
5. {
6. /*obtain entity information */
}
只有当属性具有ENTITY 形态时,script 才会继续执行接下来的步骤。意即,接下来的步骤皆包含在if 叙述之中,而且只有当if 条件判断成真时才会执行。
7. script 将获得Entity 节点,该节点代表被指派到属性的实体DTD 宣告:
Entity
=Document.doctype.entities.getNamedItem(Attribute.nodeValu
e);
Document 属性doctype(在表格9-3 中解释过)提供一个代表文件形态宣告的DocumentType 节点。DocumentType 属性entities 提供一个Entity 节点的NamedNodeMap 集合,此集合代表DTD 中所有的实体宣告。藉由传入实体名称(Attribute.nodeValue)到NamedNodeMap 对象中的方法getNamedItem,我们可以得到代表某指定实体的Entity 节点,其中getNamedItem 方法已于表格9-7
中介绍过。
8. script 会得到实体的系统literal,而系统literal 指明了包含此实体数据文件的URI。系统literal 储存在名为SYSTEM 的Attribute 节点中:
9. DisplayText +="entity file ="
10. +Entity.attributes.getNamedItem("SYSTEM").node
Value
+"\n";
11. script 会获得实体卷标的名字,而卷标是储存于名为NDATA 的Attribute 节点中:
NotationName =
Entity.attributes.getNamedItem("NDATA").nodeValue;
12. script 会得到代表实体卷标宣告的Notation 节点:
Notation =
Document.doctype.notations.getNamedItem(NotationName);
文件形态属性notations 提供一个名称节点对应集合,此集合包含表示DTD 中符号宣告的符号节点,藉由传入符号名称(NotationName)给名称节点对应中的getNamedItem 方法,得到表示实体符号的符号节点。
13. script 会获得卷标的系统literal,该系统literal 包含了卷标的URI 或如同此例是标签的描述。系统literal 是储存于Attribute 节点SYSTEM 中:
14. DisplayText +="notation URI or description ="
15. +Notation.attributes.getNamedItem("SYSTEM").no
deValue
+"\n"
16. script 借着「警示」消息框来显示所有的储存结果:
alert (DisplayText);
17. script 会借着Internet Explorer 5 开启并显示包含review 的实体档案作为结束。藉由将档案的URI(在第4 步骤中所得到的)指定到HTML 网页的location.href 属性,该URI 设定了目前显示于浏览器中档案的URL 值。
location.href = Entity.attributes.getNamedItem("SYSTEM
").nodeValue;
location.href 属性是DHTML 对象模型的一部分,你可以从网页 ttp://msdn.microsoft.com/workshop/author/default.asp 中取得相关的信息。