XML 的优势和劣势,以及 DOM、ASP 和 XSL 的应用






3.50/5 (10投票s)
2002年3月12日
7分钟阅读

91992

683
自 XML 问世以来,许多开发者一直在思考为什么需要 XML 以及如何利用 XML 来发挥其优势。在本文中,Nakul 将介绍使用 XML 及其相关技术时的一些术语,以及如何使用 ASP 和 XSL 来创建和转换 XML 文档。
引言
自 XML 问世以来,许多开发者一直在思考我们为什么需要 XML……它比 HTML 好在哪里,有什么作用?首先,XML 的功能远比 HTML 强大,而这种强大之处在于 XML 的“X”(代表可扩展)。与 HTML 提供一组预定义标签不同,XML 规定了你可以定义自己的标记语言及其标签集的标准。因此,XML 是一种元标记语言,它允许你基于 XML 定义的标准来创建无限数量的标记语言。
XML 的创建目的是为了在 Web 上使用结构丰富的文档。唯一的实际替代方案 HTML 和 SGML,对这个目的来说并不实用。XML 允许你定义各种各样的标签和各种各样的规则,例如代表业务规则的标签,或者代表数据描述或数据关系的标签。
在本文中,我们将探讨使用 XML 及其相关技术时的一些术语,以及如何使用 Microsoft 的 MSXML 解析器通过 XSL 来创建和转换 XML 文档。要测试本文中的代码示例,你应该运行安装了 IIS 的 Windows NT/2000/XP。你还应该在同一台机器上安装 SQL Server 2000。
XML 定义
与任何技术一样,XML 也有其缩写术语。一些重要的缩写包括:
- DTD:在 XML 中,有效标记的定义由文档类型定义 (DTD) 处理,它传达了标记语言的结构。DTD 指定了每个标签的有效性。
- XSL:可扩展样式语言 (XSL) 是 XML 的样式语言,它允许我们使用一组模式和模板来转换 XML 节点。
- XML 指针语言 (XPointer) 和 XML 链接语言 (XLink):这两种技术定义了一种表示资源之间链接的标准方式。除了像 HTML 的
<a>
标签这样的简单链接外,XML 还提供了在多个资源之间进行链接以及在只读资源之间进行链接的机制。XPointer 描述了如何寻址资源,而 XLink 描述了如何关联两个或多个资源。 - XML 流架构:XML 提供了一个三层架构。它可以从本身采用三层模型的现有数据库生成。我们可以单独维护业务规则。
为什么应该使用 XML?
使用 XML 为我们开发者带来了许多好处。一些最明显的好处包括:
- 作者和发布者可以使用 XML 设计他们的文档,而不必受限于 HTML。它们可以显式地为特定受众量身定制,因此 HTML 的繁琐问题理论上可以消除;因此,作者和设计者都可以自由地发明自己的标记元素。
- 信息可以更丰富,更容易访问和操作,因为 XML 的超文本链接能力比 HTML 中的更先进。
- XML 可以为浏览器呈现和性能提供更多(和改进的)功能。
XML 压缩效果极佳。由于数据压缩算法基于最大化给定输入流的熵的概念,因此高有序的输入流由规则的、重复的标签序列组成,其压缩效果应该非常好……远好于标准文本,标准文本的有序性通常差得多,因此导致性能下降。
XML 的劣势
XML 显然不是一种没有缺点的好用语言……否则我们将用 XML 来标记/表示我们所有的数据,而别无其他!当然,XML 存在一些缺点和劣势, namely:
- XML 标记可能非常冗长,具体取决于所使用的词汇。
- XML 的所有组成部分尚未就位,至少从符合标准的角度来看是这样。我们有 XSL 和 XSLT,但它们尚未完全开发。
- Microsoft 的 XML 解析器仍然存在一些问题。
- XML 超文本传输协议 (XML-HTTP) 仍然存在一些细微的问题。
XML 的性能
当设计一个基于 XML 的 Web 应用程序时,你预计会对 Web 服务器产生什么样的性能影响?很难一概而论,因为有太多的变量(例如 XML 文档的大小、处理文档所需的脚本代码量、生成的输出量等)需要考虑。然而,以下列表显示了可能影响 XML 解析性能的主要变量:
- 正在解析的 XML 数据类型。
- 标签与文本的比例。
- 属性与元素的比例。
- 文档中被丢弃的空白字符的数量。
XML 和 DOM
Microsoft 为我们提供了 MSXML 解析器,它以 DOM(文档对象模型)的形式公开 XML 文档。使用 XML DOM,你可以加载和解析 XML 文件,收集有关这些文件的信息,在其中导航和进行操作。要了解有关 XML DOM 详细信息的更多信息,请参考此站点。
现在我们已经讨论了使用 XML 的原因,是时候看看一些源代码了。我们将研究一些创建和显示 XML 数据的 ASP 脚本。我们将使用静态数据和来自数据库的数据(通过 ADO)来创建一个 XML 文件。DOM 方法 createNode
和 appendChild
,以及 text
属性被用来构建内存中的 XML 树。
ASP 中的 XML
下面的示例演示了如何创建(内存中的)XML 树,然后使用 save
方法将其持久化到磁盘。
<%
Dim xmldoc
Set xmldoc = Server.CreateObject("Microsoft.XMLDOM")
' Check to see if document has data. If it does, don't build it
If (xmldoc.childNodes.length = 0) Then
' Build the XML document
Set root = xmldoc.createNode("element", "Hi-Tech", "")
xmldoc.appendChild (root)
Set onode = xmldoc.createNode("element", "Employee", "")
onode.Text = "Gurpreet Singh"
xmldoc.documentElement.appendChild (onode)
Set inode = xmldoc.createNode("element", "Address", "")
onode.appendChild (inode)
Set child = xmldoc.createNode("element", "Address1", "")
child.Text = "Nepean Ont"
inode.appendChild (child)
Set child = xmldoc.createNode("element", "Address2", "")
child.Text = "Canada"
inode.appendChild (child)
End If
xmldoc.save (Server.Mappath("savedI2.xml"))
%>
在上面的示例中,我们创建了一个 XMLDOM
对象。然后,我们使用 createNode
函数创建了一个根节点及其子节点。接下来,在为每个节点赋值 text
属性后,我们将它们追加。最后,我们将内存中的 XML 树保存到一个文件,名为 savedI2.xml。
我们也可以从数据库查询结果构建 XML 文件。我已经将两个文件包含在本文的支持材料中:pubtest.asp 和 saved.xsl。Pubtest.asp 连接到 SQL Server 2000 的 pubs
数据库,检索 authors
表中的几个记录,将它们格式化为新的 XML 文档,并将其保存为 saved.xml。
saved.xsl 文件包含一个 XSL 样式表,它被 pubtest.asp 用于将 saved.xml 格式化为 HTML。你应该在继续之前下载支持材料。
这是 pubtest.asp 的一部分摘录:
Do While Not rs.EOF
Set onode = xmldoc.createNode("element", "Employee", "")
xmldoc.documentElement.appendChild (onode)
Set inode = xmldoc.createNode("element", "Name", "")
inode.Text = rs.fields(0) & " " & rs.fields(1)
onode.appendChild (inode)
'Grab another recordset based on the authored
Sql = "select title_id,royaltyper from titleauthor " & _
"where au_id = '" & rs.fields(2) & "'"
Set rs2 = conn.Execute(Sql)
If Not (rs2.EOF = True And rs2.bof = True) Then
Set inode = xmldoc.createNode("element", "Titles", "")
onode.appendChild (inode)
Set child = xmldoc.createNode("element", "TitleId", "")
child.Text = rs2.fields(0)
inode.appendChild (child)
Set child = xmldoc.createNode("element", "royalty", "")
child.Text = rs2.fields(1)
inode.appendChild (child)
rs2.Close
Set rs2 = Nothing
End If
rs.movenext
Loop
上面 ASP 代码生成的 XML 元素之一如下所示:
<Hi-Tech>
<Employee>
<Name>Bennet Abraham</Name>
<Titles>
<TitleId>BU1032</TitleId>
<royalty>60</royalty>
</Titles>
</Employee>
这是 XSL 样式表文件 saved.xsl 的一部分摘录:
<xsl:for-each select="Hi-Tech/Employee">
<TR>
<TD WIDTH="40%" BGCOLOR="lightyellow">
<FONT FACE="Verdana" SIZE="2" COLOR="black">
<xsl:value-of select="Name" />
</FONT>
</TD>
<TD WIDTH="30%" BGCOLOR="lightyellow">
<FONT FACE="Verdana" SIZE="2" COLOR="black">
<xsl:value-of select="Titles/TitleId" />
</FONT>
</TD>
<TD WIDTH="30%" BGCOLOR="lightyellow">
<FONT FACE="Verdana" SIZE="2" COLOR="black">
<xsl:value-of select="Titles/royalty" />
</FONT>
</TD>
</TR>
</xsl:for-each>
当我在浏览器中运行 pubtest.asp 时,它的显示效果如下:
现在,让我们逐步完成从 pubs
数据库检索数据、将其保存到 XML 文件、然后使用 MSXML 解析器加载和转换该文档(使用 XSL)的整个过程。
我们的 XML 示例说明。
首先,我们使用一个系统 DSN 连接到 SQL Server 2000。该 DSN 称为 pubs,你应该使用 Windows 控制面板来创建它。它应该连接到你的 SQL 服务器,更具体地说,连接到其 pubs
数据库。我们实例化一个 ADO connection
对象,将其 DSN 传递给它的 open
方法。
'Open database connection
Set conn = Server.CreateObject("ADODB.Connection")
dsn = "DSN=pubs;UID=sa;PWD="
conn.Open dsn
一旦连接到数据库,我们就创建一个新的 XML 文档,并为其分配一个名为 Hi-Tech
的根元素。然后,我们从 pubs
数据库的 authors
表中检索一个 recordset
。
If (xmldoc.childNodes.length = 0) Then
' Build the XML document
Set root = xmldoc.createNode("element", "Hi-Tech", "")
xmldoc.appendChild (root)
' Queries the database for customer data
Sql = "select au_lname,au_fname,au_id from authors"
Set rs = conn.Execute(Sql)
rs.MoveFirst
然后,我们遍历 recordset
中的每条记录,将其 title
、titleID
和 royalty
字段追加到我们之前创建的 XML 文档中。我们使用 createNode
和 appendChild
方法来实现此目的。
Set inode = xmldoc.createNode("element", "Titles", "")
onode.appendChild (inode)
Set child = xmldoc.createNode("element", "TitleId", "")
child.Text = rs2.fields(0)
inode.appendChild (child)
Set child = xmldoc.createNode("element", "royalty", "")
child.Text = rs2.fields(1)
inode.appendChild (child)
一旦我们从 recordset
中检索了所有记录并将其追加到我们的 XML 文档中,我们就使用 MSXML 的 save
方法将 XML 文档保存到我们的本地计算机。
xmldoc.save server.mappath("saved.xml")
现在我们已经拥有了一个名为 saved.xml 的 XML 文件,以及本文支持材料中包含的样式表 saved.xsl。我们为每个文件实例化一个新的 XMLDOM 对象,并调用 XML DOM 对象的 transformNode
方法,传入包含 XSL 文件的 XML DOM 对象的引用。
sourceFile = Server.MapPath("saved.xml")
styleFile = Server.MapPath("saved.xsl")
set source = Server.CreateObject("Microsoft.XMLDOM")
source.async = false
source.load(sourceFile)
set style = Server.CreateObject("Microsoft.XMLDOM")
style.async = false
style.load(styleFile)
最后,我们使用 Response.Write
将转换后的 XML 输出到浏览器。
Response.Write source.transformNode(style)
结论
希望本文能够解答你对 XML 的一些疑问。希望你对使用 XML 的优缺点、何时可以使用 XML 以及最重要的是如何使用 XML 有所了解。