### XML 经典问答

一.HTML 已经这样流行了，为什么还要发展 XML?
简单地讲，HTML 不能完成，我们希望 XML 所要完成的任务。原因很简单，XML 所要完成的任务，必须由元置标语言来完成，而 HTML 只是一个实例置标语言。 在 XML 发布之前，国际互联网的发展受到 HTML 如下几个问题的束缚：
1） HTML 无法描述数据内容，而这一点恰恰是数据检索、电子商务所必须的。
2） HTML 对数据表现的描述能力是十分不够的，如 HTML 还不能描述矢量图形、　　科学符号等对象，目前只能通过图象来表现这些对象。
3） HTML 实例置标语言的地位，完全不能适应对新标记需求的发展需要。
XML 的出现，使上述问题都得到很好的解决。
试想在互联网世界，如果大家都讲方言，互相交换信息时都要进行翻译，那将是一个多么难以沟通和交流的世界。在互联网世界，XML 之所以重要，恰恰是由于它扮演了"国际语言"角色的缘故。此外，XML 更为互联网世界提供了定义各行各业的"专业术语"的工具。
二.如何在浏览器中阅读 XML?
阅读 XML 文档的工具一般称为 XML 解析器, 也称为 XML 处理器。 XML 处理器将数据传送到应用软件, 以便处理, 出版, 查询, 或显示。XML 不给应用软件提供 应用程序接口 (API), 它只是把数据传给应用软件. XML 处理器不解析非构造良好的数据。 Netscape 和 Microsoft 都已经将 XML 解析器包含在其浏览器中。 XML 开发者团体提供免费的 XML 阅读器和解析器, 以便在应用软件或 XML 制作软件中进行应用。
三.为什么要使用 XML 而不是 HTML?
比较重要的原因有以下六条：
１）作者和供应商能使用 XML 设计自己的文档类型，不必被 HTML 所约束。
２）由于 XML 的超文本链接能力比 HTML 强得多，XML 提供的信息内容比 HTML 更丰富，也更易于使用。
３）XML 能提供更多更好的机制方便浏览器的信息表现和优化性能。
４）XML 舍弃了 SGML 的复杂性，因此编写处理 XML 的应用程序会很容易。
５）信息易于存储，可重复使用。
６）XML 文件在 SGML 环境中也可使用，不一定要局限于在 WEB 中使用。
四.可以用 Java 创建和管理 XML 文件吗？
是的，任何程序设计语言都能被用来从 XML 形式的源文档中输出数据。已经出现了许多的前端和后台工具使得程序设计和数据管理更加方便。下面两个网址有更加详细的说明: http://www.markwatson.com/XMLdb_0_1.htm http://developerlife.com
五.为什么 XML 文件的分析结果出现乱码?
这是由编码问题引起的。XML 标准规定，XML 分析器必须支持“UTF-8”和“UTF-16”编码，而且必须能够自动区分这两种编码的文件，对于其他编码（包括常用的中文编码“GB2312”或“BIG5”）并不要求支持。如果 XML 文件中包含编码声明，分析器则按照声明的编码进行处理，否则就按照识别结果进行处理（识别的结果总是“UTF-8”和“UTF-16”中的一种）。因此，如果 XML 文件的编码在这两种之外，你必须在 XML 文件前加上编码声明，如：<?xml version="1.0" encoding="gb2312"?>就表示 XML 文件的编码是“gb2312”。
现有的 XML 分析器大多不支持中文编码“GB2312”或“BIG5”，因此无法读取包含中文的 XML 文件。你可以使用支持中文编码的分析器，如 MSXML，IBMJAVA4C，IBMJAVA4J 等进行 XML 分析。你也可以用内码转换工具，将编码转换为“UTF-8”或“UTF-16”后进行解析，然后将解析结果转换回原来的编码。本站的软件园地中的 ccnv(Code Converter)就是这样的工具。当然，你也可以自己写一个内码转换程序。
关于“UTF-8”和“UTF-16”编码的详细信息，请查看本站标准荟萃中的 UTF-16 和 UTF-8 标准。
六.XML 如何与数据库连接?
XML 是一种文件格式，它没有规定与数据库的连接方法，你需要用传统的方法连接数据库，进行数据库查询，然后将查询结果转化为 XML 格式。现在有一些工具提供了 XML 与数据库的连接过程大都遵循这样的步骤。下面是一个利用 ASP 直接生成 XML 文件的例子，你可以访问 http://www.xml.net.cn/Asps/test/roster1.asp 查看执行效果。
<%@ language="VBScript" %>
<?xml version="1.0" encoding="gb2312"?>
<?xml:stylesheet type="text/xsl" href="..image oster.xsl"?>
<roster>
<%
set cConn = Server.CreateObject("ADODB.Connection")
call cConn.Open("DSN","USER", "PWD")
set rs = cConn.Execute("SELECT DISTINCT * FROM roster")
Do While Not rs.EOF %>
<Record>
<Name><%=trim(rs("name"))%></Name>
<NativePlace><%=trim(rs("NativePlace"))%></NativePlace>
<Age><%=trim(rs("Age"))%></Age>
<Telephone><%=trim(rs("Telephone"))%></Telephone>
</Record>
<% rs.MoveNext
Loop
rs.Close
set rs=nothing
set cConn=nothing
%>
</roster>