﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-天空-随笔分类-XML</title><link>http://www.blogjava.net/haogj/category/8076.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 01 Mar 2007 13:30:30 GMT</lastBuildDate><pubDate>Thu, 01 Mar 2007 13:30:30 GMT</pubDate><ttl>60</ttl><item><title> ANT十五大最佳实践 </title><link>http://www.blogjava.net/haogj/archive/2006/04/24/42892.html</link><dc:creator>haogj</dc:creator><author>haogj</author><pubDate>Mon, 24 Apr 2006 13:19:00 GMT</pubDate><guid>http://www.blogjava.net/haogj/archive/2006/04/24/42892.html</guid><wfw:comment>http://www.blogjava.net/haogj/comments/42892.html</wfw:comment><comments>http://www.blogjava.net/haogj/archive/2006/04/24/42892.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/haogj/comments/commentRss/42892.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/haogj/services/trackbacks/42892.html</trackback:ping><description><![CDATA[
		<script><![CDATA[unction StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}]]&gt;</script>
 
<div class="post"><div class="postTitle"><a href="http://blog.csdn.net/jason_hisoft/archive/2006/04/24/675230.aspx"><img height="13" src="http://blog.csdn.net/images/trans.gif" width="15" border="0" /> ANT十五大最佳实践</a><script language="javascript"><![CDATA[ocument.title="ANT十五大最佳实践 - "+document.title]]&gt;</script></div><div class="postText"><p>在Ant出现之前，构建和部署Java应用需要使用包括特定平台的脚本、Make文件、各种版本的IDE甚至手工操作的“大杂烩”。现在，几乎所有的开源Java项目都在使用Ant，大多数公司的内部项目也在使用Ant。Ant在这些项目中的广泛使用自然导致了读者对一整套Ant最佳实践的迫切需求。</p><p>本文总结了我喜爱的Ant技巧或最佳实践，多数是从我亲身经历的项目错误或我听说的其他人经历的 “恐怖”故事中得到灵感的。比如，有人告诉我有个项目把XDoclet 生成的代码放入带有锁定文件功能的版本控制工具中。当开发者修改源代码时，他必须记住手工检出（Check out）并锁定所有将要重新生成的文件。然后，手工运行代码生成器，只到这时他才能够让Ant编译代码，这一方法还存在如下一些问题：</p><ul><li>生成的代码无法存储在版本控制系统中。 
</li><li>Ant（本案例中是Xdoclet）应该自动确定下一次构建涉及的源文件，而不应由程序员手工确定。 
</li><li>Ant的构建文件应该定义好正确的任务依赖关系，这样程序员就不必为了完成构建而不得不按照特定顺序调用任务。 </li></ul><p>当我开始一个新项目时，我首先编写Ant构建文件。Ant文件明确地定义构建的过程，并被团队中的每个程序员使用。本文所列的技巧基于这样的假定：Ant构建文件是一个必须仔细编写的重要文件，它应在版本控制系统中得到维护，并被定期进行重构。下面是我的十五大Ant最佳实践。</p><h3>1. 采用一致的编码规范</h3><p>Ant用户有的喜欢有的痛恨其构建文件的XML语法。与其跳进这一令人迷惑的争论中，不如让我们先看一些能保持XML构建文件简洁的方法。</p><p>首先也是最重要的，花费时间格式化你的XML让它看上去很清晰。不论XML是否美观，Ant都可以工作。但是丑陋的XML很难令人读懂。倘若你在任务之间留出空行，有规则的缩进，每行文字不超过90列左右，那么XML令人惊讶地易读。再加上使用能够高亮XML语法的优秀编辑器或IDE工具，你就不会有阅读的麻烦。</p><p>同样，精选含意明确、容易读懂的词汇来命名任务和属性。比如，<em>dir.reports</em>就比<em>rpts</em>好<em>。</em>特定的编码规范并不重要，只要拿出一套规范并坚持使用就行。</p><h3>2. 将<em>build.xml</em>放在项目根目录中</h3><p>Ant构建文件<em>build.xml</em>可以放在任何位置，但是放在项目顶级目录中可以保持项目简洁。这是最常用的规范，开发者能够在顶级目录中找到预期的<em>build.xml</em>。把构建文件放在根目录中，也能够使人容易了解项目目录树中不同目录之间的逻辑关系。以下是一个典型的项目目录层次：</p><p>[root dir]<br />  | build.xml  <br />  +--src <br />  +--lib (包含第三方 JAR包) <br />  +--build (由 build任务生成)  <br />  +--dist (由 build任务生成) </p><p>当<em>build.xml</em>在顶级目录时，假设你处于项目某个子目录中，只要输入：ant -find compile 命令，不需要改变工作目录就能够以命令行方式编译代码。参数-find告诉Ant寻找存在于上级目录中的<em>build.xml</em>并执行。</p><h3>3. 使用单一的构建文件</h3><p>有人喜欢将一个大项目分解成几个小的构建文件，每个构建文件分担整个构建过程的一小部分工作。这确实是看法不同的问题，但是应该认识到，将构建文件分割会增加对整体构建过程的理解难度。要注意在单一构建文件能够清楚表现构建层次的情况下不要过工程化(over-engineer)。</p><p>即使你把项目划分为多个构建文件，也应使程序员能够在项目根目录下找到核心<em>build.xml</em>。尽管该文件只是将实际构建工作委派给下级构建文件，也应保证该文件可用。</p><h3>4. 提供良好的帮助说明</h3><p>应尽量使构建文件自文档化。增加任务描述是最简单的方法。当你输入ant -projecthelp时，你就可以看到带有描述的任务清单。比如，你可以这样定义任务：</p>&lt;target name="compile"  <br />   description="Compiles code, output goes to the build dir."&gt; 
<p>最简单的规则是把所有你想让程序员通过命令行就可以调用的任务都加上描述。对于一般用来执行中间处理过程的内部任务，比如生成代码或建立输出目录等，就无法使用描述属性。</p><p>这时，可以通过在构建文件中加入XML注释来处理。或者专门定义一个help任务，当程序员输入ant help时来显示详细的使用说明。</p>&lt;target name="help" description="Display detailed usage information"&gt;<br />  &lt;echo&gt;Detailed help...&lt;/echo&gt;&lt;/target&gt; 
<h3>5. 提供清除任务</h3><p>每个构建文件都应包含一个清除任务，用来删除所有生成的文件和目录，使系统回到构建文件执行前的初始状态。执行清空任务后还存在的文件都应处在版本控制系统的管理之下。比如：</p>&lt;target name="clean" <br />    description="Destroys all generated files and dirs."&gt;<br />  &lt;delete dir="${dir.build}"/&gt;<br />  &lt;delete dir="${dir.dist}"/&gt;<br />&lt;/target&gt; 
<p>除非是在产生整个系统版本的特殊任务中，否则不要自动调用clean任务。当程序员仅仅执行编译任务或其他任务时，他们不需要构建文件事先执行既令人讨厌又没有必要的清空任务。要相信程序员能够确定何时需要清空所有文件。</p><h3>6. 使用ANT管理任务从属关系</h3><p>假设你的应用由Swing GUI组件、Web界面、EJB层和公共应用代码组成。在大型系统中，你需要清晰地定义每个Java包属于系统的哪一层。否则任何一点修改都要被迫重新编译成百上千个文件。糟糕的任务从属关系管理会导致过度复杂而脆弱的系统。改变GUI面板的设计不应造成Servlet和EJB的重编译。</p><p>当系统变得庞大后，稍不注意就可能将依赖于客户端的代码引入到服务端。这是因为典型的IDE项目文件编译任何文件都使用单一的classpath。而Ant能让你更有效地控制构建活动。</p><p>设计你的Ant构建文件编译大型项目的步骤：首先，编译公共应用代码，将编译结果打成JAR包文件。然后，编译上一层的项目代码，编译时依靠第一步产生的JAR文件。不断重复这一过程，直到最高层的代码编译完成。</p><p>分步构建强化了任务从属关系管理。如果你工作在底层Java框架上，偶然引用到高层的GUI模板组件，这时代码不需要编译。这是由于构建文件在编译底层框架时在源路径中没有包含高层GUI面板组件的代码。</p><h3>7. 定义并重用文件路径</h3><p>如果文件路径在一个地方一次性集中定义，并在整个构建文件中得到重用，那么构建文件更易于理解。以下是这样做的一个例子：</p>&lt;project name="sample" default="compile" basedir="."&gt;<br />  &lt;path id="classpath.common"&gt;<br />    &lt;pathelement location="${jdom.jar.withpath}"/&gt;<br />    ...etc  &lt;/path&gt;<br />  &lt;path id="classpath.client"&gt;<br />    &lt;pathelement location="${guistuff.jar.withpath}"/&gt;<br />    &lt;pathelement location="${another.jar.withpath}"/&gt;<br />    &lt;!-- reuse the common classpath --&gt;<br />    &lt;path refid="classpath.common"/&gt;<br />  &lt;/path&gt;<br />  &lt;target name="compile.common" depends="prepare"&gt;<br />    &lt;javac destdir="${dir.build}" srcdir="${dir.src}"&gt;<br />          &lt;classpath refid="classpath.common"/&gt;<br />          &lt;include name="com/oreilly/common/**"/&gt;<br />    &lt;/javac&gt;<br />  &lt;/target&gt;<br />&lt;/project&gt; 
<p>当项目不断增长构建日益复杂时，这一技术越发体现出其价值。你可能需要为编译不同层次的应用定义各自的文件路径，比如运行单元测试的、运行应用程序的、运行Xdoclet的、生成JavaDocs的等等不同路径。这种组件化路径定义的方法比为每个任务单独定义路径要优越得多。否则，很容易丢失任务从属关系的轨迹。</p><h3>8. 定义恰当的任务从属关系</h3><p>假设dist任务从属于jar任务，那么哪个任务从属于compile任务哪个任务从属于prepare任务呢？Ant构建文件最终定义了任务的从属关系图，它必须被仔细地定义和维护。</p><p>应该定期检查任务的从属关系以保证构建工作得到正确执行。大的构建文件随着时间推移趋向于增加更多的任务，所以到最后可能由于不必要的从属关系导致构建工作非常困难。比如，你可能发现在程序员只需编译一些没有使用EJB的GUI代码时又重新生成了EJB代码。</p><p>以“优化”的名义忽略任务的从属关系是另一种常见的错误。这种错误迫使程序员为了得到恰当的结果必须记住并按照特定的顺序调用一串任务。更好的做法是：提供描述清晰的公共任务，这些任务包含正确的任务从属关系；另外提供一套“专家”任务让你能够手工执行个别的构建步骤，这些任务不提供完整的构建过程，但是让那些专家用户在快速而恼人的编码期间能够跳过某些步骤。</p><h3>9.使用属性</h3><p>任何需要配置或可能发生变化的信息都应作为Ant属性定义下来。对于在构建文件中多次出现的值也同样处理。属性既可以在构建文件头部定义，也可以为了更好的灵活性而在单独的属性文件中定义。以下是在构建文件中定义属性的样式：</p>&lt;project name="sample" default="compile" basedir="."&gt;<br />  &lt;property name="dir.build" value="build"/&gt;<br />  &lt;property name="dir.src" value="src"/&gt;<br />  &lt;property name="jdom.home" value="../java-tools/jdom-b8"/&gt;<br />  &lt;property name="jdom.jar" value="jdom.jar"/&gt;<br />  &lt;property name="jdom.jar.withpath"<br />                    value="${jdom.home}/build/${jdom.jar}"/&gt;<br />    etc...<br />&lt;/project&gt; 
<p>或者你可以使用属性文件：</p>&lt;project name="sample" default="compile" basedir="."&gt;<br />  &lt;property file="sample.properties"/&gt;<br />   etc...<br />&lt;/project&gt; 
<p>在属性文件 <em>sample.properties</em>中:</p>dir.build=build<br />dir.src=src<br />jdom.home=../java-tools/jdom-b8<br />jdom.jar=jdom.jarjdom.jar.withpath=${jdom.home}/build/${jdom.jar} 
<p>用一个独立的文件定义属性是有好处的，它可以清晰地定义构建中的可配置部分。另外，在开发者工作在不同操作系统的情况下，你可以在不同的平台上提供该文件的不同版本。</p><h3>10. 保持构建过程独立</h3><p>为了最大限度的扩展性，不要应用外部路径和库文件。最重要的是不要依赖于程序员的CLASSPATH设置。取而代之的是，在构建文件中使用相对路径并定义自己的路径。如果你引用了绝对路径如<em>C:\java\tools</em>，其他开发者未必使用与你相同的目录结构，所以就无法使用你的构建文件。</p><p>如果你部署开放源码项目，应该提供包含编译代码所需的所有JAR文件的发行版本。当然，这是在遵守许可协议的基础上。对于内部项目，相关的JAR文件都应在版本控制系统的管理中，并捡出（check out）到大家都知道的位置。</p><p>当你必须引用外部路径时，应将路径定义为属性。使程序员能够用适合他们自己的机器环境的参数重载这些属性。你也可以使用以下语法引用环境变量：</p>&lt;property environment="env"/&gt;<br />&lt;property name="dir.jboss" value="${env.JBOSS_HOME}"/&gt; 
<h3>11. 使用版本控制系统</h3><p>构建文件是一个重要的制品，应该像代码一样进行版本控制。当你标记你的代码时，也应用同样的标签标记构建文件。这样当你需要回溯到旧版本并进行构建时，能够使用相应版本的构建文件。</p><p>除构建文件之外，你还应在版本控制中维护第三方JAR文件。同样，这使你能够重新构建旧版本的软件。这也能够更容易保证所有开发者拥有一致的JAR文件，因为他们都是同构建文件一起从版本控制系统中捡出的。</p><p>通常应避免在版本控制系统中存放构建成果。倘若你的源代码很好地得到了版本控制，那么通过构建过程你能够重新生成任何版本的产品。</p><h3>12. 把Ant作为“最小公分母”</h3><p>假设你的开发团队使用IDE工具，当程序员通过点击图标就能够构建整个应用时为什么还要为Ant而烦恼呢？</p><p>IDE的问题是一个关于团队一致性和重现性的问题。几乎所有的IDE设计初衷都是为了提高程序员的个人生产率，而不是开发团队的持续构建。典型的IDE要求每个程序员定义自己的项目文件。程序员可能拥有不同的目录结构，可能使用不同版本的库文件，还可能工作在不同的平台上。这将导致出现这种情况：在Bob那里运行良好的代码，到Sally那里就无法运行。</p><p>不管你的开发团队使用何种IDE，一定要建立所有程序员都能够使用的Ant构建文件。要建立一个程序员在将新代码提交版本控制系统前必须执行Ant构建文件的规则。这将确保代码是经过同一个Ant构建文件构建的。当出现问题时，要使用项目标准的Ant构建文件，而不是通过某个IDE来执行一个干净的构建。</p><p>程序员可以自由选择任何他们习惯使用的IDE工具或编辑器。但是Ant应作为公共基线以保证代码永远是可构建的。</p><h3>13. 使用zipfileset属性</h3><p>人们经常使用Ant产生WAR、JAR、ZIP和 EAR文件。这些文件通常都要求有一个特定的内部目录结构，但其往往与你的源代码和编译环境的目录结构不匹配。</p><p>一个最常用的方法是写一个Ant任务，按照期望的目录结构把一大堆文件拷贝到临时目录中，然后生成压缩文件。这不是最有效的方法。使用zipfileset属性是更好的解决方案。它让你从任何位置选择文件，然后把它们按照不同目录结构放进压缩文件中。以下是一个例子：</p>&lt;ear earfile="${dir.dist.server}/payroll.ear"<br />    appxml="${dir.resources}/application.xml"&gt;<br />  &lt;fileset dir="${dir.build}" includes="commonServer.jar"/&gt;<br />  &lt;fileset dir="${dir.build}"&gt;<br />    &lt;include name="payroll-ejb.jar"/&gt;<br />  &lt;/fileset&gt;<br />  &lt;zipfileset dir="${dir.build}" prefix="lib"&gt;<br />    &lt;include name="hr.jar"/&gt;<br />    &lt;include name="billing.jar"/&gt;<br />  &lt;/zipfileset&gt;<br />  &lt;fileset dir="."&gt;<br />    &lt;include name="lib/jdom.jar"/&gt;<br />    &lt;include name="lib/log4j.jar"/&gt;<br />    &lt;include name="lib/ojdbc14.jar"/&gt;<br />  &lt;/fileset&gt;<br />  &lt;zipfileset dir="${dir.generated.src}" prefix="META-INF"&gt;<br />    &lt;include name="jboss-app.xml"/&gt;<br />  &lt;/zipfileset&gt;<br />&lt;/ear&gt; 
<p>在这个例子中，所有JAR文件都放在EAR文件包的<em>lib</em>目录中。hr.jar和billing.jar是从构建目录拷贝过来的。因此我们使用zipfileset属性把它们移动到EAR文件包内部的<em>lib</em>目录。prefix属性指定了其在EAR文件中的目标路径。</p><h3>14. 测试Clean任务</h3><p>假设你的构建文件中有clean和compile的任务，执行以下的测试。第一步，执行ant clean；第二步，执行ant compile；第三步，再执行ant compile。第三步应该不作任何事情。如果文件再次被编译，说明你的构建文件有问题。</p><p>构建文件应该只在与输出文件相关联的输入文件发生变化时执行任务。一个构建文件在不必执行诸如编译、拷贝或其他工作任务的时候执行这些任务是低效的。当项目规模增长时，即使是小的低效工作也会成为大的问题。</p><h3>15. 避免特定平台的Ant封装</h3><p>不管什么原因，有人喜欢用简单的、名称叫做<em>compile</em>之类的批文件或脚本装载他们的产品。当你去看脚本的内容你会发现以下内容：</p><p>ant compile</p><p>其实开发人员都很熟悉Ant，并且完全能够自己键入ant compile。请不要仅仅为了调用Ant而使用特定平台的脚本。这只会使其他人在首次使用你的脚本时增加学习和理解的烦扰。除此之外，你不可能提供适用于每个操作系统的脚本，这是真正烦扰其他用户的地方。</p><h3>总结</h3><p>太多的公司依靠手工方法和特别程序来编译代码和生成软件发布版本。那些不使用Ant或类似工具定义构建过程的开发团队，花费了太多的时间来捕捉代码编译过程中出现的问题：在某些开发者那里编译成功的代码，到另一些开发者那里却失败了。</p><p>生成并维护构建脚本不是一项富有魅力的工作，但却是一项必需的工作。一个好的Ant构建文件将使你能够集中到更喜欢的工作——写代码中去！</p><h3>参考</h3><ul><li><a href="http://ant.apache.org/">Ant</a></li><li><a href="http://www.ericburke.com/">AntGraph</a>: Ant依赖性的可视化工具 
</li><li><a href="http://www.oreilly.com/catalog/anttdg/index.html?CMP=IL7015">Ant: The Definitive Guide</a>, O'Reilly 
</li><li><a href="http://www.oreilly.com/catalog/jextprockbk/index.html?CMP=IL7015">Java Extreme Programming Cookbook</a>, O'Reilly </li></ul><br /><br /><p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=675230</p></div></div><img src ="http://www.blogjava.net/haogj/aggbug/42892.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/haogj/" target="_blank">haogj</a> 2006-04-24 21:19 <a href="http://www.blogjava.net/haogj/archive/2006/04/24/42892.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>xml中的空格之完全解说</title><link>http://www.blogjava.net/haogj/archive/2006/04/11/40523.html</link><dc:creator>haogj</dc:creator><author>haogj</author><pubDate>Tue, 11 Apr 2006 13:40:00 GMT</pubDate><guid>http://www.blogjava.net/haogj/archive/2006/04/11/40523.html</guid><wfw:comment>http://www.blogjava.net/haogj/comments/40523.html</wfw:comment><comments>http://www.blogjava.net/haogj/archive/2006/04/11/40523.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/haogj/comments/commentRss/40523.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/haogj/services/trackbacks/40523.html</trackback:ping><description><![CDATA[<STRONG>xml中的空格之完全解说<BR></STRONG>
<DIV width="100%">
<DIV style="FLOAT: right"><STRONG></STRONG></DIV>
<DIV>转载自:<A class=contentlink href="http://www.knowsky.com/3123.html" target=_blank><FONT color=#4455aa>http://www.knowsky.com/3123.html</FONT></A><BR>转自：动态网制作指南&nbsp;<A class=contentlink href="http://www.knowsky.com/" target=_blank contentlink=""><FONT color=#4455aa>www.knowsky.com</FONT></A>&nbsp;<BR>提示：我提取了《xslt从入门到精通》中关于空格解释的核心部分，借以抛砖引玉，希望大家踊跃参与讨论。谈谈你对空格的理解。 
<P></P>
<P>只适合对xml文件结构有一定了解的学者，不适合初学者。请按从上至下的顺序阅读。</P>
<P><BR>对html文件而言，空格不重要；然而，对xml而言，默认立场就是要保留空格结点（空格结点的解释见下文）。</P>
<P><BR>根据xml规范的规定，所谓空格是四种字符的任意组合序列：<BR>－－－－－－－－－－－－－－－－－－－－－－－<BR>空格字符（space），对应字符值为&nbsp;#x20<BR>回车字符（Carriage&nbsp;Return）,对应字符值为&nbsp;#xD<BR>换行字符（Newline）,对应字符值为&nbsp;#xA<BR>制表字符（Tab）,对应字符值为&nbsp;#x9。</P>
<P>xml文件的空格也会形成结点，也就是空格结点。空格结点属于文字结点类型。</P>
<P>对xml和xslt而言，空格结点会牵涉到两个议题：<BR>－－－－－－－－－－－－－－－－－－－－－－－<BR>1。在xml输入文件中决定哪些空格是重要的，xslt处理器要看见这些空格结点。而决定的密钥就是xml:space属性。<BR>2。在xsl模板文件中决定哪些空格是重要的，xslt处理器应将它复制到结果树中，而决定的密钥就是xsl:strip-space<BR>和xsl:preserve-space这两个命令。</P>
<P><BR>“重要和不重要的空格结点”<BR>－－－－－－－－－－－－－－－－－－－－－－－<BR>若某元素的内容只能放元素，则该元素中的空格结点就是不重要的（Insignificant）；<BR>如果某元素的内容是#PCDATA的类型，则其内的空格结点应视为重要的（Signficant）。<BR>至于元素内容混杂了文字内容和元素的情况，则无从评判，应视元素及其内容之语意而定。</P>
<P><BR>xslt处理器接触到xml输入文件之前，会先由xml分析器进行分析<BR>－－－－－－－－－－－－－－－－－－－－－－－<BR>（1）xml:space属性可以改变后续接手的xml应用程序处理空格结点的模式，例如，xslt处理器就会受xml:space属性影响。<BR>（2）xml文件中任何一列标记或内容尾端的结尾的结尾符号全部会换成单一新行字符（#xA）。<BR>（3）属性值交给xml应用程序之前，xml分析器也应该先对属性值做规范化的操作。这是因为不同的操作系统每一行文字列的结尾字符有不同的组合，例如，windows系统会由返回字符呵新行字符组成结尾符号，而Unix系统则仅由新行字符组&nbsp;成结尾符号。xml分析器在读取xml文件之后，便先行将所有结尾符号换成单一新行字符，不仅统一了不同系统间不同结尾符号设计的差异性，同时也简化了后续xml应用程序的的操作难度。这样一个处理过程称为“规范化(Normalization)”。<BR>&nbsp;a，每一文字列的结尾符号都要规范化成单一的新行字符（#xA）。<BR>&nbsp;b，任何一个空格符（#x20、#xD、#xA、#x9）都应换成一个空格字符（#x20）。<BR>&nbsp;c，属性值中若含有字参码，则应替换成该参考字符，例如，<I>&amp;#</I>xA;会换成新行字符(#xA)。<BR>&nbsp;d，属性值若含有实体参考，则应以其替换文字替换。<BR>&nbsp;e，除此之外，任何字符都应直接放入规范化属性值中。<BR>&nbsp;f，最后，如果属性类型不是CDATA，则xml分析器应该再进一步把属性值前后的空格字符序列删除，而且属性值中间若有空格序列，也应该替换成单一空格字符。<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>xslt处理器把xml输入文件和xsl模板文件的结构树建好之后，会现把组件中相邻的文字结点合并成单一的文字结点，然后再把一些文字结点抽掉。然而，如果文字结点符合下列条件之一，就会被保留下来：<BR>－－－－－－－－－－－－－－－－－－－－－－－<BR>（1）文字结点的父元素是空格保留元素名称集（Set&nbsp;Of&nbsp;Whitespace-preserving&nbsp;Element&nbsp;Names）中的一员。<BR>（2）文字结点中至少有一个非空格符。<BR>（3）文字结点的某个祖先组件中有xml:space属性，其值为preserve，而且较近的祖先元素中没有其他xml:space属性值为default。除此之外的文字结点逗会被抽掉。</P>
<P><BR>对xsl模板而言，所谓的空格保留元素名称集只有一个xsl:text组件可用。xsl模板文件的空格结点都会被删除，但是，如果空格结点出现在xsl:text组件中就会被保留下来。</P>
<P><BR>&nbsp;</P></DIV></DIV><img src ="http://www.blogjava.net/haogj/aggbug/40523.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/haogj/" target="_blank">haogj</a> 2006-04-11 21:40 <a href="http://www.blogjava.net/haogj/archive/2006/04/11/40523.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符编码的奥秘</title><link>http://www.blogjava.net/haogj/archive/2006/04/09/40120.html</link><dc:creator>haogj</dc:creator><author>haogj</author><pubDate>Sun, 09 Apr 2006 14:08:00 GMT</pubDate><guid>http://www.blogjava.net/haogj/archive/2006/04/09/40120.html</guid><wfw:comment>http://www.blogjava.net/haogj/comments/40120.html</wfw:comment><comments>http://www.blogjava.net/haogj/archive/2006/04/09/40120.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/haogj/comments/commentRss/40120.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/haogj/services/trackbacks/40120.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 编码问题是信息处理的基本问题，但是由于历史和政治的问题，事实上存在着大量不统一的编码方式，造成在信息处理过程中的信息丢失，转换错误等问题，UCS 为问题的解决提供了一个很好的方向，但是，在现在的软件环境中，还没有达到全面地使用。在实际中工作中应尽量采用统一的编码格式，减少编码问题的发生 <br><br>&nbsp;&nbsp;<a href='http://www.blogjava.net/haogj/archive/2006/04/09/40120.html'>阅读全文</a><img src ="http://www.blogjava.net/haogj/aggbug/40120.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/haogj/" target="_blank">haogj</a> 2006-04-09 22:08 <a href="http://www.blogjava.net/haogj/archive/2006/04/09/40120.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用于解析 sina 新闻页面的 XSLT 文件 </title><link>http://www.blogjava.net/haogj/archive/2006/03/20/36437.html</link><dc:creator>haogj</dc:creator><author>haogj</author><pubDate>Mon, 20 Mar 2006 13:29:00 GMT</pubDate><guid>http://www.blogjava.net/haogj/archive/2006/03/20/36437.html</guid><wfw:comment>http://www.blogjava.net/haogj/comments/36437.html</wfw:comment><comments>http://www.blogjava.net/haogj/archive/2006/03/20/36437.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/haogj/comments/commentRss/36437.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/haogj/services/trackbacks/36437.html</trackback:ping><description><![CDATA[
		<div>&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />&lt;xsl:stylesheet version="1.0" xmlns:xsl="<a href="http://www.w3.org/1999/XSL/Transform"><font color="#000033">http://www.w3.org/1999/XSL/Transform</font></a>"&gt;<br /> &lt;xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/&gt;<br /> &lt;xsl:template match="/"&gt;<br />  &lt;html&gt;<br />   &lt;head&gt;<br />    &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"/&gt;<br />    &lt;title&gt;Sina newsletter&lt;/title&gt;<br />   &lt;/head&gt;<br />   &lt;body&gt;<br />    &lt;xsl:apply-templates select="html/body/div/table/tbody/tr/td/div[@id='article']"/&gt;<br />   &lt;/body&gt;<br />  &lt;/html&gt;<br /> &lt;/xsl:template&gt;<br /> <br /> &lt;!-- 新闻内容 --&gt;<br /> &lt;xsl:template match="div"&gt;<br /> <br />  &lt;!-- 新闻标题 --&gt;<br />  &lt;xsl:apply-templates select="table/tbody/tr/th/h1"/&gt;<br />  <br />  &lt;!-- 新闻的内容 --&gt;<br />  &lt;xsl:apply-templates select="table/tbody/tr/td"/&gt;<br /> &lt;/xsl:template&gt;<br /> </div>
		<div> &lt;!-- 显示标题  --&gt;<br /> &lt;xsl:template match="h1"&gt;<br />  &lt;h1&gt;<br />   &lt;xsl:value-of select="text()"/&gt;<br />  &lt;/h1&gt;<br /> &lt;/xsl:template&gt;</div>
		<div> &lt;!-- 显示段落 --&gt;<br /> &lt;xsl:template match="p"&gt;<br />  &lt;p&gt;<br />   &lt;xsl:apply-templates /&gt;<br />  &lt;/p&gt;<br /> &lt;/xsl:template&gt;<br /> <br /> &lt;!-- 显示内容中文字 --&gt;<br /> &lt;xsl:template match="text()"&gt;<br />  &lt;xsl:value-of select="."/&gt;<br /> &lt;/xsl:template&gt;<br /> <br />&lt;/xsl:stylesheet&gt;<br /></div>
<img src ="http://www.blogjava.net/haogj/aggbug/36437.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/haogj/" target="_blank">haogj</a> 2006-03-20 21:29 <a href="http://www.blogjava.net/haogj/archive/2006/03/20/36437.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转帖]XML 中的常见问题</title><link>http://www.blogjava.net/haogj/archive/2006/03/05/33743.html</link><dc:creator>haogj</dc:creator><author>haogj</author><pubDate>Sun, 05 Mar 2006 12:34:00 GMT</pubDate><guid>http://www.blogjava.net/haogj/archive/2006/03/05/33743.html</guid><wfw:comment>http://www.blogjava.net/haogj/comments/33743.html</wfw:comment><comments>http://www.blogjava.net/haogj/archive/2006/03/05/33743.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/haogj/comments/commentRss/33743.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/haogj/services/trackbacks/33743.html</trackback:ping><description><![CDATA[<STRONG>[转帖]XML&nbsp;中的常见问题<BR></STRONG>
<DIV width="100%">
<DIV style="FLOAT: right"><STRONG></STRONG></DIV>
<DIV>XML&nbsp;中的常见问题 
<P></P>
<P>引自：<A class=contentlink href="http://www.microsoft.com/china/msdn/Archives/workshop/xmlfaq.asp" target=_blank><FONT color=#4455aa>http://www.microsoft.com/china/msdn/Archives/workshop/xmlfaq.asp</FONT></A></P>
<P>--------------------------------------------------------------------------------<BR>Microsoft&nbsp;Corporation<BR>2000&nbsp;年&nbsp;6&nbsp;月&nbsp;7&nbsp;日&nbsp;<BR>目录&nbsp;</P>
<P>一般问题&nbsp;</P>
<P>什么是&nbsp;XML？&nbsp;<BR>什么是&nbsp;MSXML？&nbsp;<BR>Microsoft&nbsp;XML&nbsp;分析器能够做什么？&nbsp;<BR>MSXML、MSXML2&nbsp;和&nbsp;MSXML3&nbsp;之间的区别是什么？&nbsp;<BR>XML&nbsp;可以代替&nbsp;HTML&nbsp;吗？&nbsp;<BR>在&nbsp;HTML&nbsp;中增加&nbsp;XML&nbsp;的好处是什么？&nbsp;<BR>XML&nbsp;只适用于核心开发人员吗？&nbsp;<BR>开始使用&nbsp;XML&nbsp;时需要什么？&nbsp;<BR>有如何使用&nbsp;XML&nbsp;的实际例子吗？&nbsp;<BR>我可以忽略&nbsp;XML&nbsp;吗？&nbsp;<BR>Microsoft&nbsp;Internet&nbsp;Explorer&nbsp;4.0&nbsp;支持&nbsp;XML&nbsp;吗？&nbsp;<BR>Internet&nbsp;Explorer&nbsp;5.0&nbsp;对&nbsp;XML&nbsp;提供哪个级别的支持？&nbsp;<BR>HTML、动态&nbsp;HTML&nbsp;和&nbsp;XML&nbsp;之间的关系是什么？&nbsp;<BR>为什么&nbsp;XML&nbsp;这么重要？&nbsp;<BR>Microsoft&nbsp;提供什么&nbsp;XML&nbsp;产品？&nbsp;<BR>在&nbsp;Web&nbsp;上传输，必须压缩&nbsp;XML&nbsp;吗？&nbsp;&lt;<BR>XML&nbsp;作为数据格式有多安全？有没有增加&nbsp;XML&nbsp;安全性的计划？<BR>确认&nbsp;</P>
<P>什么是&nbsp;DTD&nbsp;及其用途？&nbsp;<BR>Web&nbsp;开发人员在使用&nbsp;XML&nbsp;描述数据时必须包括&nbsp;DTD&nbsp;吗？&nbsp;<BR>什么是&nbsp;XML&nbsp;架构？它们与&nbsp;DTD&nbsp;的区别是什么？&nbsp;<BR>什么是名称空间，它们为何重要？&nbsp;<BR>XSLT&nbsp;和&nbsp;XPath&nbsp;</P>
<P>什么是&nbsp;XSLT？&nbsp;<BR>XSL、XQL、XSL&nbsp;模式&nbsp;和&nbsp;XSLT&nbsp;之间的区别是什么？&nbsp;<BR>什么是&nbsp;XPath？&nbsp;<BR>为什么&nbsp;XSLT&nbsp;对&nbsp;XML&nbsp;很重要？&nbsp;<BR>XSLT&nbsp;和&nbsp;CSS&nbsp;之间的区别是什么？它们不是样式表吗？<BR>标准&nbsp;</P>
<P>Microsoft&nbsp;如何与&nbsp;XML&nbsp;标准兼容？&nbsp;<BR>XML&nbsp;和&nbsp;World&nbsp;Wide&nbsp;Web&nbsp;Consortium&nbsp;(W3C)&nbsp;之间的关系是什么？&nbsp;<BR>XML&nbsp;和&nbsp;W3C&nbsp;的地位关系如何？&nbsp;<BR>DOM&nbsp;在&nbsp;W3C&nbsp;中的地位如何？<BR>工具支持&nbsp;</P>
<P>SQL&nbsp;Server&nbsp;和&nbsp;ADO&nbsp;支持&nbsp;XML&nbsp;吗？&nbsp;<BR>目前有&nbsp;Microsoft&nbsp;工具可以帮助我快速沿用&nbsp;XML&nbsp;吗？&nbsp;<BR>什么是&nbsp;SOAP？&nbsp;<BR>XML&nbsp;如何适用于构造三层&nbsp;Web&nbsp;使能的应用程序的&nbsp;<BR>Microsoft&nbsp;Windows(R)&nbsp;Distributed&nbsp;InterNet&nbsp;Applications&nbsp;(Windows&nbsp;DNA)&nbsp;策略？</P>
<P>问题和解决方案&nbsp;</P>
<P>为什么在调用了&nbsp;Load()&nbsp;方法后，我的文档对象仍然为空？&nbsp;<BR>如何加载有外国和特殊字符的文档？&nbsp;<BR>如何在&nbsp;Visual&nbsp;Studio&nbsp;6.0&nbsp;C++&nbsp;中使用&nbsp;MSXML&nbsp;COM&nbsp;组件？&nbsp;<BR>如何在&nbsp;XML&nbsp;中使用&nbsp;HTML&nbsp;实体？&nbsp;<BR>在元素内容中如何处理空白字符？&nbsp;<BR>如何处理属性中的空白字符？&nbsp;<BR>在&nbsp;XML&nbsp;对象模型中如何处理空白字符？&nbsp;<BR>XML&nbsp;声明做什么？&nbsp;<BR>如何以可读格式打印我的&nbsp;XML&nbsp;文档？&nbsp;<BR>如何在&nbsp;DTD&nbsp;中使用名称空间？&nbsp;<BR>如何在&nbsp;Visual&nbsp;Basic&nbsp;中使用&nbsp;XMLDSO？&nbsp;<BR>如何在&nbsp;Java&nbsp;中使用&nbsp;XML&nbsp;DOM？</P>
<P>--------------------------------------------------------------------------------</P>
<P>一般问题&nbsp;</P>
<P>什么是&nbsp;XML？&nbsp;</P>
<P>可扩展标记语言&nbsp;(XML)&nbsp;是&nbsp;Web&nbsp;上的数据通用语言。它使开发人员能够将结构化数据，从许多不同的应用程序传递到桌面，进行本地计算和演示。XML&nbsp;允许为特定应用程序创建唯一的数据格式。它还是在服务器之间传输结构化数据的理想格式。</P>
<P>什么是&nbsp;MSXML？&nbsp;</P>
<P>MSXML&nbsp;是提供核心&nbsp;XML&nbsp;服务的&nbsp;Microsoft&nbsp;软件组件。</P>
<P>Microsoft&nbsp;XML&nbsp;分析器能够做什么？&nbsp;</P>
<P>最新版本的&nbsp;Microsoft&nbsp;核心&nbsp;XML&nbsp;服务提供下面四种不同的功能。</P>
<P>基于文档对象模型&nbsp;(DOM)&nbsp;的分析器，它能够获取文本流（能够转换到&nbsp;XML&nbsp;的文件、程序中的字符串或者任何其他文本）并将它转换为能够编程处理的可导航&nbsp;XML&nbsp;树结构。</P>
<P><BR>SAX（Simple&nbsp;API&nbsp;for&nbsp;XML）分析器，它针对处理大型文档和高吞吐量的情况进行了优化的。SAX&nbsp;是基于事件的分析器，它读取文档并将分析事件（例如元素的开始和结尾）直接报告给应用程序。用户创建的应用程序实现了处理不同事件的处理程序，这非常类似于处理图形用户界面&nbsp;(GUI)&nbsp;中的事件。</P>
<P><BR>XSLT&nbsp;处理器读取&nbsp;XSLT&nbsp;文件，并将可扩展样式表转换语言&nbsp;(XSLT)&nbsp;文件的指令应用到&nbsp;XML&nbsp;文件，以产生某些类型的输出。除了创建&nbsp;XML结构之外，XSLT&nbsp;处理器还可以在得到的&nbsp;XSLT&nbsp;过滤器上执行一定量的优化，另外，从技术的角度看，它更像是一种编译器。</P>
<P><BR>验证分析器读取文档类型定义&nbsp;(DTD)&nbsp;或者&nbsp;XML&nbsp;架构，然后检验实际得到的文档的格式是否正确，以及是否不包含与架构冲突的数据。请注意，仅对架构而言，验证架构将返回架构本身作为对象，可以在以后在&nbsp;HTML&nbsp;列表框中创建选项时引用这个对象。&nbsp;<BR>所有四种功能都包含在同一&nbsp;MSXML&nbsp;库软件包中，它可以从&nbsp;MSDN&nbsp;XML&nbsp;开发人员中心（英文）免费得到。</P>
<P>MSXML、MSXML2&nbsp;和&nbsp;MSXML3&nbsp;之间的区别是什么？&nbsp;</P>
<P>在过去三年中&nbsp;XML&nbsp;经历了许多反复，所以目前存在不同版本的&nbsp;Microsoft&nbsp;XML&nbsp;分析器也不奇怪。Internet&nbsp;Explorer&nbsp;4.0&nbsp;包含早期版本的&nbsp;XML&nbsp;分析器，它比&nbsp;XSL、XML&nbsp;数据或者大多数其他的&nbsp;XML&nbsp;技术（并且有完全不同的&nbsp;DOM&nbsp;模型）要早。该早期版本的分析器包含在&nbsp;MSXML.dll&nbsp;库中。从&nbsp;MSDN&nbsp;XML&nbsp;开发人员中心（英文）可将分析器升级到较新的一种。</P>
<P>我们极力建议您升级到新的分析器，因为它要强大得多。Internet&nbsp;Explorer&nbsp;5.0&nbsp;包括&nbsp;MSXML&nbsp;2.0&nbsp;分析器，它包含&nbsp;XSL&nbsp;和&nbsp;XML&nbsp;架构的基本版本。MSXML2&nbsp;是&nbsp;SQL&nbsp;Server&nbsp;2000&nbsp;附带的分析器版本。MSXML2&nbsp;包含了许多性能增强的功能，并且在总体上提高了性能和可伸缩性。MSXML3&nbsp;是当前作为“技术预览”附带的版本。MSXML3&nbsp;包括&nbsp;XSLT&nbsp;和&nbsp;XPath&nbsp;支持以及&nbsp;SAX&nbsp;接口。</P>
<P>XML&nbsp;可以代替&nbsp;HTML&nbsp;吗？&nbsp;</P>
<P>XML&nbsp;比&nbsp;HTML&nbsp;提供更大的灵活性，但是它不可能很快代替&nbsp;HTML。实际上，XML&nbsp;和&nbsp;HTML&nbsp;能够很好地在一起工作。Microsoft&nbsp;希望许多作者和开发人员都能同时使用&nbsp;XML&nbsp;和&nbsp;HTML，比如用&nbsp;XSLT&nbsp;来生成&nbsp;HTML。</P>
<P>在&nbsp;HTML&nbsp;中增加&nbsp;XML&nbsp;的好处是什么？&nbsp;</P>
<P>在&nbsp;Web&nbsp;上使用&nbsp;XML&nbsp;的好处有：</P>
<P>它提供用于本地计算的数据。传递到桌面的数据可以进行本地计算。XML&nbsp;分析器可以读取数据，并将它递交给本地应用程序（例如浏览器）进一步查看或处理。数据也可以由使用&nbsp;XML&nbsp;对象模型的脚本或其他编程语言来处理。</P>
<P><BR>向用户提供正确的结构化数据视图。传递到桌面的数据可以以多种方式表示。本地数据集，可以根据用户喜好和配置等因素，以适当的形式，在视图中动态表现给用户。</P>
<P><BR>允许集成不同来源的结构化数据。一般情况下，使用代理，在中间层服务器上集成来自后端数据库和其他应用程序的数据，使该数据能够传递给桌面或者其他服务器，做进一步聚合、处理和分布。</P>
<P><BR>描述来自多种应用程序的数据。由于&nbsp;XML&nbsp;是可扩展的，因此它可以用于描述来自多种应用程序的数据，从描述&nbsp;Web&nbsp;页面集合到数据记录。由于数据是自描述的，因此不需要数据的内置描述，也能够接收和处理数据。</P>
<P><BR>通过粒度更新来提高性能。XML&nbsp;允许粒度更新。开发人员不必在每次有改动时都发送整个结构化数据集。有了粒度更新后，只有改变的元素才必须从服务器发送到客户机。改变的数据可以在不必刷新整个页面或表的情况下显示。&nbsp;<BR>XML&nbsp;只适用于核心开发人员吗？&nbsp;</P>
<P>不。和&nbsp;HTML&nbsp;文档一样，XML&nbsp;文档可以由任何人创建&nbsp;—&nbsp;甚至是没有任何编程经验的人。XML&nbsp;仅仅是一种描述信息的标准方式。此外，它还是一种语言，可以在没有任何软件的情况下用它来编写。您可以在文本编辑器中编写&nbsp;XML&nbsp;文档，并且直接放入&nbsp;Web&nbsp;站点，不需要编写传统方式下的任何代码。</P>
<P>开始使用&nbsp;XML&nbsp;时需要什么？&nbsp;</P>
<P>要使用&nbsp;XML，您需要能够读取&nbsp;XMl&nbsp;文档的&nbsp;XML&nbsp;分析器，并且使它的内容能被处理。Microsoft&nbsp;提供了一种分析器，可以从&nbsp;MSDN&nbsp;XML&nbsp;开发人员中心（英文）下载。&nbsp;</P>
<P>要使用&nbsp;XML&nbsp;文档，可以使用文本编辑器（例如记事本）或任何其他可以用于创建&nbsp;HTML&nbsp;页面的编辑器。要创建完整形式的&nbsp;XML&nbsp;应用程序，请使用诸如&nbsp;Microsoft®&nbsp;Visual&nbsp;Studio®&nbsp;的编程环境。</P>
<P>有如何使用&nbsp;XML&nbsp;的实际例子吗？&nbsp;</P>
<P>XML&nbsp;正在数量惊人的应用程序中使用，范围从&nbsp;Web&nbsp;站点创建和文档化到数据库集成和分布式编程。在下面几个领域中，XML&nbsp;有其用武之地：</P>
<P>业务对业务的传输。业务数据（发票、购买定单、会计和税务信息等等）是以&nbsp;XML&nbsp;格式在厂商之间电子传输的。与旧的电子数据交换&nbsp;(EDI)&nbsp;格式相比，XML&nbsp;提供了许多优点，而不仅仅是可以在传输中从一种发票格式转换到另一种。</P>
<P><BR>分布式编程。XML&nbsp;是非常理想的复杂多平台应用程序构造方案，这样就使得&nbsp;Windows&nbsp;服务器和其他操作系统的集成成为可能。</P>
<P><BR>Web&nbsp;站点体系结构。由于&nbsp;XML&nbsp;的层次结构和分布式特性，Web&nbsp;站点开发人员在他们&nbsp;Web&nbsp;站点的总体体系结构和导航结构中越来越多地使用它。此外，越来越多的目录表和索引表、跟踪用户信息及&nbsp;Web&nbsp;站点状态的&nbsp;XML&nbsp;结构、基于&nbsp;HTML&nbsp;的组件和处理数据流的渠道，都用&nbsp;XML&nbsp;和&nbsp;XSLT&nbsp;编写。</P>
<P><BR>数据库操作。XML&nbsp;正成为与数据库交互的流行工具&nbsp;—&nbsp;无论从&nbsp;SQL&nbsp;查询中检索&nbsp;XML&nbsp;数据集，还是用&nbsp;XML&nbsp;记录更新数据库。而且我们还有分离实现的优点。通过将数据压缩为&nbsp;SML，就不需要对实际的数据库结构有任何了解。</P>
<P><BR>文档管理。目前的大多数公司都陷在文书工作的海洋里，而且会越来越糟。XML&nbsp;正在越来越多地用于将文档编码成&nbsp;XML，使文档更易于检索或提供链接到文档的注释上下文，以便更有效地进行参考。&nbsp;<BR>我可以忽略&nbsp;XML&nbsp;吗？&nbsp;</P>
<P>如果您想在&nbsp;Internet&nbsp;世界中竞争的话，那就不可以忽略&nbsp;XML。XML&nbsp;是导致以我们考虑编程本身的方式进行模式转移的一种语言。传统的专用客户机/服务器应用程序，正在给“随时随地访问”的&nbsp;Internet&nbsp;服务让位，XML&nbsp;是处理任何事情（从数据访问处理到在该新环境中表现数据）的逻辑媒体。</P>
<P>Microsoft&nbsp;Internet&nbsp;Explorer&nbsp;4.0&nbsp;支持&nbsp;XML&nbsp;吗？&nbsp;</P>
<P>是的。Internet&nbsp;Explorer&nbsp;4.0&nbsp;支持&nbsp;XML&nbsp;下列功能：</P>
<P>通用的&nbsp;XML&nbsp;分析器，它读取&nbsp;XML&nbsp;文件并将它们传递到应用程序（例如查看器）进行处理。应用程序开发人员可以使用&nbsp;Microsoft&nbsp;的两个分析器：C++&nbsp;中的&nbsp;Microsoft&nbsp;XML&nbsp;分析和&nbsp;Java&nbsp;中的&nbsp;Microsoft&nbsp;XML&nbsp;分析器。</P>
<P><BR>XML&nbsp;对象模型&nbsp;(XML&nbsp;OM)&nbsp;使用&nbsp;World&nbsp;Wide&nbsp;Web&nbsp;Consortium&nbsp;(W3C)&nbsp;标准文档对象模型&nbsp;(DOM)&nbsp;允许程序通过&nbsp;XML&nbsp;分析器访问结构化数据，使开发人员拥有交互和计算数据的能力。有关详细信息，请参见&nbsp;DOM&nbsp;规范（英文）&nbsp;。</P>
<P><BR>XML&nbsp;数据源对象&nbsp;(XML&nbsp;DSO)&nbsp;允许开发人员连接到结构化&nbsp;XML&nbsp;数据，并用动态&nbsp;HTML&nbsp;的数据绑定机制将它提供给&nbsp;HTML&nbsp;页面。&nbsp;<BR>Internet&nbsp;Explorer&nbsp;5.0&nbsp;对&nbsp;XML&nbsp;提供哪个级别的支持？&nbsp;</P>
<P>Internet&nbsp;Explorer&nbsp;5&nbsp;提供下列&nbsp;XML&nbsp;支持：</P>
<P>直接查看&nbsp;XML。Microsoft&nbsp;XML&nbsp;实现允许用户通过他们的&nbsp;Web&nbsp;浏览器使用&nbsp;XSL&nbsp;或者层叠样式表&nbsp;(CSS)&nbsp;查看&nbsp;XML，就象查看&nbsp;HTML&nbsp;文档一样。</P>
<P><BR>高性能、验证&nbsp;XML&nbsp;引擎。Internet&nbsp;Explorer&nbsp;4.0&nbsp;开发人员熟悉的&nbsp;XML&nbsp;引擎已经得到了很大的增强，并且完全支持&nbsp;W3C&nbsp;XML&nbsp;1.0&nbsp;和&nbsp;XML&nbsp;名称空间，这样开发人员就可以在&nbsp;Web&nbsp;上统一限定元素名称，从而避免了相同名称的元素之间的冲突。Windows&nbsp;中的本机&nbsp;XML&nbsp;支持意味着，当开发人员在应用程序和组件之间移动数据时，可以使用完整的&nbsp;XML&nbsp;处理功能来读取和处理数据。</P>
<P><BR>可扩展样式转换语言&nbsp;(XSLT)&nbsp;支持。使用基于最新的&nbsp;W3C&nbsp;Working&nbsp;Draft&nbsp;的&nbsp;Microsoft&nbsp;XSLT&nbsp;处理器，开发人员可以对&nbsp;XML&nbsp;数据应用样式表，并以易于自定义的动态和灵活方式来显示数据。Microsoft&nbsp;XSLT&nbsp;处理器的查询功能也允许开发人员用程序，在客户机或服务器上，在&nbsp;XML&nbsp;数据集内部查找和摘取信息。</P>
<P><BR>XML&nbsp;架构。架构（英文）&nbsp;定义&nbsp;XML&nbsp;文档规则，包括元素名称和丰富的数据类型，它们的元素可以表现为组合，并且每个元素的属性都可用。为了启用多层应用程序，Microsoft&nbsp;将根据提交给&nbsp;W3C&nbsp;XML&nbsp;工作组的缩减&nbsp;XML&nbsp;数据架构&nbsp;(XDR)&nbsp;来发布&nbsp;XML&nbsp;架构的技术预览。</P>
<P><BR>服务器端&nbsp;XML。服务器端&nbsp;XML&nbsp;处理允许使用&nbsp;XML&nbsp;作为在多个分布式应用程序服务器（甚至是跨越操作系统边界）之间传送数据的标准方式。</P>
<P><BR>XML&nbsp;文档对象模型&nbsp;(DOM)。XML&nbsp;DOM&nbsp;是标准对象应用程序编程接口，它使开发人员能够用程序控制&nbsp;XML&nbsp;文档内容、结构、格式等等。Microsoft&nbsp;XML&nbsp;实现包括对&nbsp;W3C&nbsp;XML&nbsp;DOM&nbsp;建议的完全支持，并且可以用脚本、Visual&nbsp;Basic&nbsp;开发系统、C++&nbsp;和其他编程语言来访问。</P>
<P><BR>C++&nbsp;XML&nbsp;数据源对象。XML&nbsp;DSO&nbsp;允许将&nbsp;HTML&nbsp;元素直接绑定到&nbsp;XML&nbsp;数据岛。此外，它还提高了性能，有强大的能力可以绑定到不同&nbsp;XML&nbsp;节点上，而且利用了&nbsp;Internet&nbsp;Explorer&nbsp;5&nbsp;beta&nbsp;中所有的新的数据绑定功能。&nbsp;<BR>HTML、动态&nbsp;HTML&nbsp;和&nbsp;XML&nbsp;之间的关系是什么？&nbsp;</P>
<P>HTML&nbsp;可以和&nbsp;CSS&nbsp;一起用于格式化和表示超链接页面。动态&nbsp;HTML，通过&nbsp;DOM，使&nbsp;HTML&nbsp;中的所有元素，都可以通过与语言无关的脚本和其他编程语言来访问，从而在很大程度上提高了客户机端的交互能力，而且不需要对服务器的额外需求。页面的对象模型允许动态更改任何方面的内容（包括增加、删除和移动）。</P>
<P>通过为结构化数据添加&nbsp;XML，为开发人员提供了构造下一代丰富、灵活&nbsp;Web&nbsp;应用程序的技术。使用&nbsp;XML，他们可以为桌面提供结构化数据，并且用&nbsp;XML&nbsp;对象模型计算数据。现在的开发人员可以在浏览器（例如&nbsp;Microsoft&nbsp;Internet&nbsp;Explorer&nbsp;4.0&nbsp;和&nbsp;Microsoft&nbsp;Internet&nbsp;Explorer&nbsp;5）或者其他应用程序中，通过脚本显示基于&nbsp;XML&nbsp;的数据。此外，他们也可以对数据应用格式化规则，而不需要使用&nbsp;XSLT&nbsp;样式表的复杂脚本（实际上是将基于&nbsp;XML&nbsp;的数据转换为显示）。这两种显示基于&nbsp;XML&nbsp;数据的方法，都使得生成复杂数据的多个视图成为可能。</P>
<P>为什么&nbsp;XML&nbsp;这么重要？&nbsp;</P>
<P>XML&nbsp;将成为计算领域的未来。作为一种技术，它的影响力将渗透到编程的每个方面，从嵌入式系统到图形界面，到分布式系统以及数据库管理。它实际上已经成为软件工业之间数据通信的标准，并且迅速代替&nbsp;EDI&nbsp;系统成为全球几乎所有工业进行业务交换的主要媒体。它很有可能会成为创建和存储大多数文档的语言，不管是否在&nbsp;Internet&nbsp;上，并且有可能成为&nbsp;Internet&nbsp;应用程序服务器的基础，有些人相信它将代替许多目前生产的小包装产品。</P>
<P>Microsoft&nbsp;提供什么&nbsp;XML&nbsp;产品？&nbsp;</P>
<P>Microsoft&nbsp;正在努力为许多领域开发&nbsp;XML&nbsp;资源：</P>
<P>数据访问。最新的&nbsp;ActiveX®&nbsp;数据对象&nbsp;(ADO)&nbsp;的化身，已经支持&nbsp;XML&nbsp;的生成和消费将近一年了，并且&nbsp;Microsoft&nbsp;SQL&nbsp;Server&nbsp;2000&nbsp;为基于&nbsp;SQL&nbsp;的信息和&nbsp;XML&nbsp;之间的互相转换提供了许多接口。</P>
<P><BR>浏览器支持。Microsoft&nbsp;是第一个生产能够阅读&nbsp;XML&nbsp;文件（无论是用原始结构形式，还是通过&nbsp;XSL&nbsp;或&nbsp;CSS&nbsp;样式表）的商业浏览器&nbsp;(Internet&nbsp;Explorer&nbsp;5)&nbsp;的公司。</P>
<P><BR>BizTalk&nbsp;Server&nbsp;2000。Microsoft®&nbsp;BizTalk(TM)&nbsp;Server&nbsp;2000&nbsp;提供了在大量不同格式（包括&nbsp;XML）之间通信的方式，来帮助推动业务对业务的应用程序。BizTalk&nbsp;Server&nbsp;也包括了许多架构生成和映射工具，从而大大简化了业务或商业需要的&nbsp;XML&nbsp;结构的开发。&nbsp;<BR>在&nbsp;Web&nbsp;上传输，必须压缩&nbsp;XML&nbsp;吗？&nbsp;</P>
<P>一般来说，压缩&nbsp;XML&nbsp;的需要是与应用程序有关的，并且很大程度上是服务器和客户机之间移动数据量的函数。用于描述数据结构的标记的反复特性，使&nbsp;XML&nbsp;能够非常好地压缩数据。值得注意的是&nbsp;HTTP&nbsp;1.1&nbsp;服务器和客户机的压缩都是标准的，XML&nbsp;可以自动从中受益。</P>
<P>XML&nbsp;作为数据格式有多安全？有没有增加&nbsp;XML&nbsp;安全性的计划？&nbsp;</P>
<P>XML&nbsp;和&nbsp;HTML&nbsp;一样安全。正因为安全的&nbsp;HTTP&nbsp;(HTTPS)&nbsp;可以用于对&nbsp;HTTP&nbsp;添加密码技术，从而保护了&nbsp;HTML，因此它也可以用于保护&nbsp;XML。XML&nbsp;是表示结构化数据的基于文本格式。这可以使数据的简单性和互操作性最大化。对&nbsp;XML&nbsp;格式增加安全性和验证能力时可以采取许多步骤。首先，XML&nbsp;可以在传输到客户之前在服务器上加密，然后在客户机上解密。应用于数据本身的数字签名也可以验证&nbsp;XML。</P>
<P>确认&nbsp;</P>
<P>什么是&nbsp;DTD&nbsp;及其用途？&nbsp;</P>
<P>文档类型定义&nbsp;(DTD)&nbsp;定义了一类&nbsp;XML&nbsp;文档的正确语法。也就是说，它列出了许多元素名称，什么元素可以和其他元素一起显示，什么属性可以用于每种元素类型等等。DTD&nbsp;使用&nbsp;XML&nbsp;文档使用的不同语法形式。</P>
<P>Web&nbsp;开发人员在使用&nbsp;XML&nbsp;描述数据时必须包括&nbsp;DTD&nbsp;吗？&nbsp;</P>
<P>不。XML&nbsp;可以用于描述有或没有&nbsp;DTD&nbsp;的数据。术语“有效”XML&nbsp;指代引用&nbsp;DTD&nbsp;的&nbsp;XML&nbsp;数据，而“良好形成的”XML&nbsp;是未使用&nbsp;DTD&nbsp;的&nbsp;XML。此外，“良好形成的”XML&nbsp;还是&nbsp;XML&nbsp;和标准统一标记语言&nbsp;(SGML)&nbsp;的基本区别之一。很明显，在这两种情况下，XML&nbsp;本身都必须遵守语言的标准（例如，所有标记都必须是闭合的，并且标记不能重叠）。</P>
<P>什么是&nbsp;XML&nbsp;架构？它们与&nbsp;DTD&nbsp;的区别是什么？&nbsp;</P>
<P>虽然&nbsp;XML&nbsp;1.0&nbsp;提供了定义&nbsp;XML&nbsp;文档的内容模型的机制&nbsp;—&nbsp;DTD&nbsp;—&nbsp;但是很明显还需要定义内容模型的更全面更有效的方法。XML&nbsp;架构是特殊的&nbsp;XML&nbsp;结构的定义（从其组织和数据类型两个方面）。XML&nbsp;架构使用“XML&nbsp;架构”语言来指定在架构中如何定义元素的每种类型，以及与元素关联的数据类型。与&nbsp;DTD&nbsp;相比，架构的最鲜明的特点，便是架构本身就是&nbsp;XML&nbsp;文档。这意味着阅读它所描述的&nbsp;XML&nbsp;的工具也可以阅读它。</P>
<P>Microsoft&nbsp;的&nbsp;XML&nbsp;服务目前支持&nbsp;XML&nbsp;数据架构，它代表了在&nbsp;1999&nbsp;年&nbsp;3&nbsp;月&nbsp;Internet&nbsp;Explorer&nbsp;5&nbsp;装运时&nbsp;“W3C&nbsp;架构”活动的快照。XML&nbsp;数据架构允许开发人员在他们的&nbsp;XML&nbsp;文档中添加数据类型，以及定义开放的内容模型。这种对&nbsp;DTD&nbsp;功能的扩展对&nbsp;XML&nbsp;编程很关键。</P>
<P>但是&nbsp;W3C&nbsp;正在准备“XML&nbsp;架构定义&nbsp;(XSD)”，它将成为“XML&nbsp;架构标准”。Microsoft&nbsp;计划在此规范成为建议后，立即使对“XML&nbsp;架构定义&nbsp;(XSD)”的支持成为它核心&nbsp;XML&nbsp;服务的一部分。</P>
<P>什么是名称空间，它们为何重要？&nbsp;</P>
<P>名称空间是&nbsp;XML&nbsp;的另一个高级功能，并作为&nbsp;XML&nbsp;1.0&nbsp;规范的一部分，在&nbsp;W3C&nbsp;笔记中作了概述。它们允许开发人员限定元素名称和关系。名称空间使元素名称唯一可识别，从而避免了名称相同，但是在不同词典中定义的元素之间发生名称冲突。它们允许混合来自不同名称空间的标记，这一点对多个来源的数据很重要。</P>
<P>例如，书店可以定义&nbsp;&lt;TITLE&gt;&nbsp;标记代表书名，它只包含在&nbsp;&lt;BOOK&gt;&nbsp;元素中。但是，个人目录可以定义&nbsp;&lt;TITLE&gt;&nbsp;代表个人的职位，例如：</P>
<P>&nbsp;&nbsp;&lt;TITLE&gt;President&lt;/TITLE&gt;</P>
<P>名称空间有助于清晰地定义这种差别。</P>
<P>XSLT&nbsp;和&nbsp;XPATH&nbsp;</P>
<P>什么是&nbsp;XSLT？&nbsp;</P>
<P>XSLT（英文）&nbsp;，或者用于转换的可扩展样式表语言，它是在&nbsp;1999&nbsp;年&nbsp;11&nbsp;月&nbsp;6&nbsp;日获得批准的&nbsp;W3C&nbsp;建议。从标记和编程两重意义上说，这种语言提供了将&nbsp;XML&nbsp;结构转换到其他&nbsp;XML&nbsp;结构、HTML&nbsp;或者任何数量的其他文本格式（例如&nbsp;SQL）的机制。虽然它可以用于创建&nbsp;Web&nbsp;页面的显示输出，但是&nbsp;XSLT&nbsp;的实际功能在于能够改变底层结构，而不是简单地改变这些结构的媒体表示，就像在层叠样式表&nbsp;(CSS)&nbsp;中一样。</P>
<P>XSL、XQL、XSL&nbsp;模式&nbsp;和&nbsp;XSLT&nbsp;之间的区别是什么？&nbsp;</P>
<P>XSLT&nbsp;源自&nbsp;CSS&nbsp;在对&nbsp;XML&nbsp;文档结构改动上的局限性，当时创建&nbsp;XML&nbsp;的原因更倾向于代替&nbsp;HTML&nbsp;而不是提供通用数据描述语言。因此可扩展样式表语言&nbsp;(XSL)&nbsp;成为构造格式化&nbsp;XML&nbsp;新方法的成果。</P>
<P>但是，“W3C&nbsp;样式工作”组的成员和早期&nbsp;XML&nbsp;采用者很快就发现，能够将&nbsp;XML&nbsp;从一种格式转换到另一个格式的语言，可以极大地简化生成的大量代码。Microsoft&nbsp;向&nbsp;W3C&nbsp;提交了一个建议，最初名称为&nbsp;XML&nbsp;查询语言（或&nbsp;XQL），它随之被&nbsp;W3C&nbsp;采纳为&nbsp;XSL&nbsp;模式语言。该语言的大多数功能最终都被纳入了&nbsp;XSLT&nbsp;规范中。&nbsp;</P>
<P>最终标准结合了为不同初始条件而修改的&nbsp;XSLT&nbsp;参数，创建代码功能块的命名模板，以及大量用于数值和字符串处理的增强功能。XSLT&nbsp;还为在语言中添加内置功能提供方便，提供了&nbsp;Microsoft&nbsp;可在自己的实现中用来添加许多极其有用功能（包括访问&nbsp;COM&nbsp;对象和脚本）的产品。</P>
<P>什么是&nbsp;XPath？&nbsp;</P>
<P>XPath（英文）&nbsp;&nbsp;是为&nbsp;XML&nbsp;定义的查询语言，它提供在文档中选择节点子集的简单语法。通过&nbsp;XPath，通过指定类似于目录的路径（即名称）以及路径中的条件，可以检索元素集合。XPath&nbsp;对&nbsp;XSLT&nbsp;和&nbsp;XML&nbsp;DOM&nbsp;都很重要，并与&nbsp;XPointer&nbsp;规范（允许根据统一资源定位符&nbsp;[URL]&nbsp;和&nbsp;XPath&nbsp;表达式的组合来选择文档片断）有联系。</P>
<P>为什么&nbsp;XSLT&nbsp;对&nbsp;XML&nbsp;很重要？&nbsp;</P>
<P>XSLT&nbsp;是将一种&nbsp;XML&nbsp;文档转换为另一种的语言。这意味着它提供了单源&nbsp;XML&nbsp;数据的机制，可以在&nbsp;Web&nbsp;页面中创建由用户动态更改的丰富视图，可以为目标通信过滤数据。XSLT&nbsp;对于业务规则编码已经足够强大。它可以从数据生成图形（不仅仅是&nbsp;Web&nbsp;页面）。它甚至可以处理与其他服务器的通信&nbsp;—&nbsp;特别是和能够集成到&nbsp;XSLT&nbsp;中的脚本模块协作&nbsp;—&nbsp;以及在&nbsp;XSLT&nbsp;自身内部生成适当的消息。虽然它不可能代替桌面系统中的大多数交互（出于性能和使用方便性两方面分原因），但是在未来的几年中，XSLT&nbsp;很有可能最终成为系统之间进行通信的主要“编程”语言。</P>
<P>XSLT&nbsp;和&nbsp;CSS&nbsp;之间的区别是什么？它们不是样式表吗？&nbsp;</P>
<P>层叠样式表&nbsp;(CSS)&nbsp;的任务是对&nbsp;HTML&nbsp;元素指定一组显示属性。CSS&nbsp;决定了页面的视觉外观，但是不会改变源文档的结构。</P>
<P>另一方面，XSLT&nbsp;也称为基于模板的语言，它允许将某种模式映射到源文档中，该源文档的输出是用&nbsp;XML、HTML&nbsp;或纯文本书写的。使用&nbsp;XSLT，可以将&nbsp;XML&nbsp;文档的结构转换为不同的&nbsp;XML&nbsp;文档。例如，您可以更改&nbsp;XML&nbsp;文档的顺序、添加或删除元素、执行条件测试或者用元素的集合进行迭代。</P>
<P>XSLT&nbsp;和&nbsp;CSS&nbsp;不是兼容标准。一种在&nbsp;XML&nbsp;中创建&nbsp;Web&nbsp;页面的有用技术，是用&nbsp;XSLT&nbsp;将&nbsp;XML&nbsp;转换为诸如列表或表的结构，然后将&nbsp;CSS&nbsp;应用于结果，控制这些结构在适当媒体中的显示。您甚至可以从&nbsp;XSLT&nbsp;创建&nbsp;CSS。</P>
<P>标准&nbsp;</P>
<P>Microsoft&nbsp;如何与&nbsp;XML&nbsp;标准兼容？&nbsp;</P>
<P>从&nbsp;XML&nbsp;语言开始产生起，Microsoft&nbsp;就站在了&nbsp;XML&nbsp;的最前沿，而且很值得注意的是，W3C&nbsp;在过去几年中所生成的大多数&nbsp;XML&nbsp;建议和工作草案，都包括来自至少一个（在某些情况下可能是数个）Microsoft&nbsp;职员的输入和参与。Microsoft&nbsp;已经多次被委以重任，与&nbsp;W3C&nbsp;标准组织一起，确保&nbsp;XML&nbsp;的开发能使所有用户受益，并且在许多不同领域的开发中都作出了重要贡献，包括&nbsp;XML&nbsp;规范、DOM、XSLT&nbsp;和架构定义语言。Microsoft&nbsp;承诺将与最新规范和标准保持一致。</P>
<P>XML&nbsp;和&nbsp;World&nbsp;Wide&nbsp;Web&nbsp;Consortium&nbsp;(W3C)&nbsp;之间的关系是什么？&nbsp;</P>
<P>W3C&nbsp;有一活跃的&nbsp;XML&nbsp;工作组。Microsoft&nbsp;从&nbsp;1996&nbsp;年&nbsp;6&nbsp;月起就是该组织的共同发起者之一，从那时起许多业界企业都开始加入，包括&nbsp;Netscape&nbsp;Communications&nbsp;Corp.、IBM&nbsp;和&nbsp;Oracle。有关&nbsp;XML&nbsp;标准过程的详细信息，请访问&nbsp;W3C&nbsp;Web&nbsp;站点（英文）。</P>
<P>XML&nbsp;和&nbsp;W3C&nbsp;的地位关系如何？&nbsp;</P>
<P>XML&nbsp;1.0&nbsp;是在&nbsp;1998&nbsp;年&nbsp;12&nbsp;月被正式批准的，现在仍是个稳定的标准。有关当前&nbsp;XML&nbsp;规范的详细信息以及&nbsp;W3C&nbsp;内部的提交和审阅过程，请参见&nbsp;W3C&nbsp;Web&nbsp;站点（英文）。</P>
<P>DOM&nbsp;在&nbsp;W3C&nbsp;中的地位如何？&nbsp;</P>
<P>DOM&nbsp;Level&nbsp;1&nbsp;的&nbsp;W3C&nbsp;文档状态为“推荐”。这说明&nbsp;W3C&nbsp;目前正在提议将它作为&nbsp;World&nbsp;Wide&nbsp;Web&nbsp;上的标准。有关&nbsp;DOM&nbsp;和在&nbsp;W3C&nbsp;内部提交和审阅过程的详细信息，请参见&nbsp;DOM&nbsp;规范（英文）。</P>
<P>工具支持&nbsp;</P>
<P>SQL&nbsp;Server&nbsp;和&nbsp;ADO&nbsp;支持&nbsp;XML&nbsp;吗？&nbsp;</P>
<P>Microsoft&nbsp;ActiveX&nbsp;数据对象&nbsp;(ADO)&nbsp;技术，提供许多将数据库记录集（数据记录集合）转换为&nbsp;XML&nbsp;格式的方法，以及从给定结构中获取&nbsp;XML&nbsp;并将其转换回&nbsp;ADO&nbsp;所支持数据库（包括&nbsp;SQL&nbsp;Server&nbsp;和&nbsp;Oracle&nbsp;数据库）的工具。此外，通过&nbsp;MSXML2&nbsp;和&nbsp;MSXML3&nbsp;中的&nbsp;XML&nbsp;数据源对象，还可以将任意&nbsp;XML&nbsp;直接加载到&nbsp;ADO&nbsp;中以生成记录集。</P>
<P>SQL&nbsp;Server&nbsp;2000&nbsp;还允许通过&nbsp;URL&nbsp;直接设置和检索&nbsp;XML，方式和调用&nbsp;Web&nbsp;页面非常相似。这是处理数据的强大机制，因为它基本上意味着可以将&nbsp;SQL&nbsp;Server&nbsp;数据直接集成到&nbsp;XML&nbsp;过滤器和&nbsp;Web&nbsp;页面，基本上凡是有&nbsp;XML&nbsp;文档的地方都可以集成&nbsp;SQL&nbsp;Server&nbsp;数据。此外，还可以设置自定义模板，来控制如何从&nbsp;SQL&nbsp;Server&nbsp;数据中产生&nbsp;XML，使数据库成为生成&nbsp;XHTML&nbsp;页面的强大工具。</P>
<P>最后，诸如&nbsp;BizTalk&nbsp;Server&nbsp;这样的应用程序还允许在任意数量的不同数据源（从&nbsp;XML&nbsp;文档到数据库到&nbsp;Excel&nbsp;和&nbsp;Word&nbsp;文档）之间进行映射、为&nbsp;Web&nbsp;体系结构创建复杂数据管道以及根据&nbsp;XML&nbsp;数据库需求构造有效的架构。</P>
<P>目前有&nbsp;Microsoft&nbsp;工具可以帮助我快速沿用&nbsp;XML&nbsp;吗？&nbsp;</P>
<P>Microsoft&nbsp;BizTalk&nbsp;Server&nbsp;2000&nbsp;是用于数据交换的、基于&nbsp;XML&nbsp;的服务器，它提供启用电子商务业务社会的基本结构和工具。BizTalk&nbsp;Server&nbsp;的基础是基于规则的业务文档路由、转换和跟踪基本结构。该基本结构允许公司通过在组织边界之内或之间的应用程序中间交换业务文档，例如购买定单和发票，来集成、管理和自动化业务过程。有关详细信息，请参见Microsoft&nbsp;BizTalk&nbsp;Server&nbsp;2000（英文）&nbsp;。</P>
<P>什么是&nbsp;SOAP？&nbsp;</P>
<P>SOAP&nbsp;是简单对象访问协议，是创建大范围分布式、复杂计算环境的工具，该计算环境可使用现有的&nbsp;Internet&nbsp;基本结构运行在&nbsp;Internet&nbsp;上。SOAP&nbsp;可以使应用程序用许许多多方法在&nbsp;Internet&nbsp;上互相直接通信。有关&nbsp;SOAP&nbsp;的详细信息，请参见&nbsp;SOAP&nbsp;规范（英文）。</P>
<P>XML&nbsp;如何适用于&nbsp;Microsoft&nbsp;Windows®&nbsp;Distributed&nbsp;InterNet&nbsp;Applications&nbsp;(Windows&nbsp;DNA)&nbsp;策略来构造三层并具有&nbsp;Web&nbsp;功能的应用程序？&nbsp;</P>
<P>XML&nbsp;正在快速成为将结构化数据从中间层传送到桌面的工具。基于&nbsp;XML&nbsp;的数据可以通过中间层代理与多种后端（数据库）源集成。架构（参见“XML&nbsp;数据”一节）可以改进该过程，并且开发人员可以更精确地描述和交换数据。</P>
<P>问题和解决方案&nbsp;</P>
<P>为什么在调用了&nbsp;Load()&nbsp;方法后，我的文档对象仍然为空？&nbsp;</P>
<P>默认情况下操作是异步加载的。这意味着如果提供&nbsp;http&nbsp;URL&nbsp;地址，那么&nbsp;load()&nbsp;方法将直接返回，并且文档对象仍然为空，因为数据还没有从服务器返回。为了纠正这个问题，请在代码中添加下面的行：</P>
<P>xmldoc.async&nbsp;=&nbsp;false;</P>
<P>同时，如果是从独立的&nbsp;C++&nbsp;应用程序加载&nbsp;http&nbsp;XML&nbsp;文档，那么必须查询消息队列才能继续加载。</P>
<P>如何加载有外国和特殊字符的文档？&nbsp;</P>
<P>文档可以包含外国字符，例如：</P>
<P>&lt;test&gt;foreign&nbsp;characters&nbsp;(úóíÿ)&nbsp;&lt;/test&gt;</P>
<P>例如&nbsp;磲&nbsp;的外国字符必须在前面加上&nbsp;escape&nbsp;序列。外国字符可以是&nbsp;UTF-8&nbsp;编码或用不同编码指定，如下所示：<BR>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="iso-8859-1"?&gt;<BR>&lt;test&gt;foreign&nbsp;characters&nbsp;(磲)&nbsp;&lt;/test&gt;</P>
<P>现在可以正确加载&nbsp;XML&nbsp;了。</P>
<P>其他字符是保留在&nbsp;XML&nbsp;中的，并且需要以不同的方式处理。下面的&nbsp;XML：</P>
<P>&lt;foo&gt;This&nbsp;&amp;&nbsp;that&lt;/foo&gt;<BR>产生如下错误：<BR>此处不允许有空格。<BR>行&nbsp;0000001:&nbsp;&lt;foo&gt;This&nbsp;&amp;&nbsp;that&lt;/foo&gt;<BR>位置&nbsp;&nbsp;0000012:&nbsp;----------^</P>
<P>此处&nbsp;&amp;&nbsp;是&nbsp;XML&nbsp;句法结构的一部分，如果它仅仅放在&nbsp;XML&nbsp;数据源内部，那么不能解释为&nbsp;&amp;。您需要替换称为“实体”的特殊字符序列。</P>
<P>&lt;foo&gt;This&nbsp;&amp;&nbsp;that&lt;/foo&gt;<BR>下面的字符需要相应的实体：</P>
<P>&lt;&nbsp;&lt;<BR>&amp;&nbsp;&amp;<BR>&gt;&nbsp;&gt;<BR>"&nbsp;"<BR>'&nbsp;&amp;apos;</P>
<P>引号字符被用作标记中属性值的定界符，因此通常不能在属性值的内部使用。例如，下面的内容将返回错误：<BR>&lt;foo&nbsp;description="John´s&nbsp;Stuff"&gt;</P>
<P>此处的单引号既用作属性定界符，又在属性值自身中。为了纠正这个问题，可以将属性定界符换成双引号：</P>
<P>&lt;foo&nbsp;description="John´s&nbsp;Stuff"&gt;<BR>或者可以将单引号转义为实体&nbsp;&amp;apos;&nbsp;</P>
<P>&lt;foo&nbsp;description="John&amp;apos;&nbsp;Stuff"&gt;<BR>上述两种方式都将通过&nbsp;XML&nbsp;对象模型中的&nbsp;getAttribute&nbsp;方法返回属性值&nbsp;John's&nbsp;Stuff。同样，对于双引号，您可以使用实体<BR>"。<BR>也可以通过将文本放在&nbsp;CDATA&nbsp;节中来处理元素内容中的特殊字符。下面的内容是正确的：</P>
<P>&lt;xml&gt;<BR>&nbsp;&nbsp;&lt;![CDATA[&nbsp;This&nbsp;&amp;&nbsp;that&nbsp;&lt;stuff&gt;&nbsp;is&nbsp;just&nbsp;"text"&nbsp;content。&nbsp;]]&gt;<BR>&lt;/xml&gt;<BR>在本例子中，XML&nbsp;对象模型将&nbsp;CDATA&nbsp;节点显示&nbsp;xml&nbsp;节点的子节点，它将返回字符串</P>
<P>This&nbsp;&amp;&nbsp;that&nbsp;&lt;stuff&gt;&nbsp;is&nbsp;just&nbsp;"text"&nbsp;content.<BR>作为&nbsp;node<I>value</I>。</P>
<P><BR>如何在&nbsp;Visual&nbsp;Studio&nbsp;6.0&nbsp;C++&nbsp;中使用&nbsp;MSXML&nbsp;COM&nbsp;组件？&nbsp;</P>
<P>在&nbsp;Visual&nbsp;C++&nbsp;6.0&nbsp;中使用&nbsp;MSXML&nbsp;COM&nbsp;组件的最简便方式是使用&nbsp;#import&nbsp;指令：</P>
<P>#import&nbsp;"msxml.dll"&nbsp;named_guids&nbsp;no_namespace#import&nbsp;"msxml.dll"&nbsp;named_guids&nbsp;no_namespace<BR>它定义了所有&nbsp;IXML*&nbsp;接口和接口&nbsp;ID，从而可以在应用程序中使用它们了。也可以从&nbsp;INETSDK&nbsp;获取&nbsp;MSXML&nbsp;类型库和头文件（英文），以及包含类&nbsp;IIDs&nbsp;的&nbsp;uuid.lib。</P>
<P>如何在&nbsp;XML&nbsp;中使用&nbsp;HTML&nbsp;实体？&nbsp;</P>
<P>下面的&nbsp;XML&nbsp;包含&nbsp;HTML&nbsp;实体：</P>
<P>&lt;copyright&gt;Copyright&nbsp;©&nbsp;2000,&nbsp;Microsoft&nbsp;Inc,&nbsp;All&nbsp;rights&nbsp;reserved.&lt;/copyright&gt;</P>
<P>它产生下列错误：</P>
<P>引用未定义的实体&nbsp;'copy'。<BR>行：&nbsp;1,&nbsp;位置：23,&nbsp;错误码：0xC00CE002<BR>&lt;copyright&gt;Copyright&nbsp;©&nbsp;2000,&nbsp;...<BR>----------------------^</P>
<P>这是因为&nbsp;XML&nbsp;只有五个内置实体。关于内置实体的详细信息，请参阅如何加载有外国和特殊字符的文档？。</P>
<P>要使用&nbsp;HTML&nbsp;实体，需要用&nbsp;DTD&nbsp;定义它们。有关&nbsp;DTD&nbsp;的详细信息，请参阅&nbsp;W3C&nbsp;XML&nbsp;建议（英文）。要使用该&nbsp;DTD，请将它直接包括在&nbsp;DOCTYPE&nbsp;标记中，如下所示：<BR>&lt;!DOCTYPE&nbsp;foo&nbsp;SYSTEM&nbsp;"<A class=contentlink href='http://msdn.microsoft.com/xml/general/htmlentities.dtd">' target=_blank><FONT color=#4455aa>http://msdn.microsoft.com/xml/general/htmlentities.dtd"&gt;</FONT></A><BR>&lt;copyright&gt;Copyright&nbsp;©&nbsp;2000,&nbsp;Microsoft&nbsp;Inc,&nbsp;All&nbsp;rights&nbsp;reserved.&lt;/copyright&gt;<BR>要加载它，需要关闭&nbsp;IXMLDOMDocument&nbsp;接口的&nbsp;validateOnParse&nbsp;属性。请尝试将它粘贴到“Validator&nbsp;测试页”中，关闭&nbsp;DTD&nbsp;验证，然后单击“验证”。请注意文档将加载，并且版权字符将显示在&nbsp;validator&nbsp;页面的末尾的&nbsp;DOM&nbsp;树中。</P>
<P>如果已经完成了&nbsp;DTD&nbsp;验证，那么必须将作为参数实体的&nbsp;HTML&nbsp;实体包括在现有的&nbsp;DTD&nbsp;中，如下所示：<BR>&lt;!ENTITY&nbsp;%&nbsp;HTMLENT&nbsp;SYSTEM&nbsp;"<A class=contentlink href='http://msdn.microsoft.com/xml/general/htmlentities.dtd">' target=_blank><FONT color=#4455aa>http://msdn.microsoft.com/xml/general/htmlentities.dtd"&gt;</FONT></A><BR>%HTMLENT;&lt;!ENTITY&nbsp;%&nbsp;HTMLENT&nbsp;SYSTEM&nbsp;"<A class=contentlink href='http://msdn.microsoft.com/xml/general/htmlentities.dtd">' target=_blank><FONT color=#4455aa>http://msdn.microsoft.com/xml/general/htmlentities.dtd"&gt;</FONT></A><BR>%HTMLENT;<BR>它将定义所有&nbsp;HTML&nbsp;实体，以便在&nbsp;XML&nbsp;文档中使用它们。</P>
<P>在元素内容中如何处理空白字符？&nbsp;</P>
<P>XML&nbsp;DOM&nbsp;有三种访问元素文本内容的方式：</P>
<P>属性&nbsp;行为&nbsp;<BR>node<I>value</I>&nbsp;按照原始的&nbsp;XML&nbsp;源中指定的那样，返回&nbsp;TEXT、CDATA、COMMENT&nbsp;和&nbsp;PI&nbsp;节点上的原始文本内容（包括空白字符）。对于&nbsp;ELEMENT&nbsp;节点和&nbsp;DOCUMENT&nbsp;本身，则返回空值。&nbsp;<BR>数据&nbsp;与&nbsp;node<I>value</I>&nbsp;相同&nbsp;<BR>文本&nbsp;重复连接指定子树中的多个&nbsp;TEXT&nbsp;和&nbsp;CDATA&nbsp;节点并返回组合结果。&nbsp;</P>
<P>注意：&nbsp;空白字符包括新行、tab&nbsp;和空格。</P>
<P>node<I>value</I>&nbsp;属性通常返回原始文档中的内容，与文档如何加载和当前&nbsp;xml:space&nbsp;范围无关。</P>
<P>文本属性连接指定子树中的所有文本并扩展实体。这与文档如何加载、preserveWhiteSpace&nbsp;开关的当前状态和当前&nbsp;xml:space&nbsp;范围有关，请看如下所示：</P>
<P>preserveWhiteSpace&nbsp;=&nbsp;true&nbsp;when&nbsp;the&nbsp;document&nbsp;is&nbsp;loaded&nbsp;preserveWhiteSpace=true&nbsp;preserveWhiteSpace=true&nbsp;preserveWhiteSpace=false&nbsp;preserveWhiteSpace=false&nbsp;<BR>xml:space=preserve&nbsp;xml:space=default&nbsp;xml:space=preserve&nbsp;xml:space=default&nbsp;<BR>保留&nbsp;保留&nbsp;保留&nbsp;保留并截断&nbsp;</P>
<P>preserveWhiteSpace&nbsp;=&nbsp;false&nbsp;when&nbsp;the&nbsp;document&nbsp;is&nbsp;loaded&nbsp;preserveWhiteSpace=true&nbsp;preserveWhiteSpace=true&nbsp;preserveWhiteSpace=false&nbsp;preserveWhiteSpace=false&nbsp;<BR>xml:space=preserve&nbsp;xml:space=default&nbsp;xml:space=preserve&nbsp;xml:space=default&nbsp;<BR>半保留&nbsp;半保留并截断&nbsp;半保留&nbsp;半保留并截断&nbsp;</P>
<P><BR>此处的保留表示和原始&nbsp;XML&nbsp;文档中完全相同的原始文本内容，截断意味着前导和尾部空格已经删除，半保留意味着保留了“重要的空白字符”并规范化了“不重要的空白字符”。重要的空白字符是文本内容内部的空白字符。不重要的空白字符是标记之间的空白字符，请看如下所示：</P>
<P>&lt;name&gt;\n<BR>\t&lt;first&gt;&nbsp;&nbsp;&nbsp;&nbsp;Jane&lt;/first&gt;\n<BR>\t&lt;last&gt;Smith&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/last&gt;\n<BR>&lt;/name&gt;<BR>在本示例中，红色是可以忽略的不重要的空白字符，而绿色是重要的空白字符，因为它是文本内容的一部分，因此有不可忽略的重要含义。所以在本例中，文本属性返回下列结果：</P>
<P>状态&nbsp;返回值&nbsp;<BR>保留&nbsp;"\n\t&nbsp;&nbsp;&nbsp;&nbsp;Jane\n\tSmith&nbsp;&nbsp;&nbsp;&nbsp;\n"<BR>&nbsp;<BR>保留并截断&nbsp;"Jane\n\tSmith"<BR>&nbsp;<BR>半保留&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;Jane&nbsp;Smith&nbsp;&nbsp;&nbsp;&nbsp;"<BR>&nbsp;<BR>半保留并截断&nbsp;"Jane&nbsp;Smith"<BR>&nbsp;</P>
<P>请注意“半保留”将规范化不重要的空白字符，例如，新行和&nbsp;tab&nbsp;字符将退化为单个空格。如果更改&nbsp;xml:space&nbsp;属性和&nbsp;preserveWhiteSpace&nbsp;开关，那么文本属性将返回相应的不同值。</P>
<P>CDATA&nbsp;and&nbsp;xml:space="preserve"&nbsp;subtree&nbsp;boundaries&nbsp;<BR>在下面的例子中，CDATA&nbsp;节点或“保留”节点的内容将得到连接，原因是它们不参与不重要的空白字符规范化。例如：</P>
<P>&lt;name&gt;\n<BR>\t&lt;first&gt;&nbsp;Jane&nbsp;&lt;/first&gt;\n<BR>\t&lt;last&gt;&lt;![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Smith&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]&gt;&lt;/last&gt;\n<BR>&lt;/name&gt;<BR>在这种情况下，CDATA&nbsp;节点内部的空白字符不再与“不重要”空白字符“合并”，并且不会截断。因此“半保留并截断”情况将返回下列内容：</P>
<P>"Jane&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Smith&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"<BR>在此，&lt;/first&gt;&nbsp;和&nbsp;&lt;last&gt;&nbsp;标记之间的不重要的空白字符将包括在内，与&nbsp;CDATA&nbsp;节点的内容无关。如果用下列内容代替&nbsp;CDATA，那么将返回相同结果：</P>
<P>&lt;last&nbsp;xml:space="preserve"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Smith&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/last&gt;<BR>实体是特殊的&nbsp;</P>
<P>实体是作为&nbsp;DTD&nbsp;的一部分加载和分析的，并且显示在&nbsp;DOCTYPE&nbsp;节点下。它们不一定要有任何&nbsp;xml:space&nbsp;范围。例如：</P>
<P>&lt;!DOCTYPE&nbsp;foo&nbsp;[<BR>&lt;!ENTITY&nbsp;Jane&nbsp;"&lt;employee&gt;\n<BR>\t&lt;name&gt;&nbsp;Jane&nbsp;&lt;/name&gt;\n<BR>\t&lt;title&gt;Software&nbsp;Design&nbsp;Engineer&lt;/title&gt;\n<BR>&lt;/employee&gt;"&gt;<BR>]&gt;<BR>&lt;foo&nbsp;xml:space="preserve"&gt;&amp;Jane;&lt;/foo&gt;<BR>假定&nbsp;preserveWhiteSpace=false（在&nbsp;DOCTYPE&nbsp;标记范围内），在分析实体时不重要的空白字符丢失。实体将不会有空白字符节点。树将类似于：</P>
<P>DOCTYPE&nbsp;foo<BR>&nbsp;&nbsp;&nbsp;&nbsp;ENTITY:&nbsp;Jane<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ELEMENT:&nbsp;employee<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ELEMENT:&nbsp;name<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TEXT:&nbsp;Jane&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ELEMENT:&nbsp;title<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TEXT&gt;:Software&nbsp;Design&nbsp;Engineer<BR>&nbsp;&nbsp;&nbsp;&nbsp;ELEMENT:&nbsp;foo<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ATTRIBUTE:&nbsp;xml:space="preserve"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ENTITYREF:&nbsp;Jane</P>
<P>请注意，在&nbsp;DOCTYPE&nbsp;内部&nbsp;ENTITY&nbsp;节点下显露的&nbsp;DOM&nbsp;树不包含任何&nbsp;WHITESPACE&nbsp;节点。这意味着&nbsp;ENTITYREF&nbsp;节点的子节点也没有&nbsp;WHITESPACE&nbsp;节点，即使实体引用在&nbsp;xml:space="preserve"&nbsp;的范围内也是这样。</P>
<P>给定文档中引用的每个&nbsp;ENTITY&nbsp;的实例通常都有相同的树。</P>
<P>如果实体必须绝对保留空白字符，那么它必须在自己内部指定自己的&nbsp;xml:space&nbsp;属性，或者文档&nbsp;preserveWhiteSpace&nbsp;开关必须设置为&nbsp;true。</P>
<P>如何处理属性中的空白字符？&nbsp;</P>
<P>有几种方式可以访问属性值。IXMLDOMAttribute&nbsp;接口有&nbsp;node<I>value</I>&nbsp;属性，它等价于作为&nbsp;Microsoft&nbsp;扩展的&nbsp;node<I>value</I>&nbsp;和&nbsp;text&nbsp;属性。这些属性返回：属性&nbsp;返回的文本&nbsp;<BR>attrNode.node<I>value</I><BR>attrNode.<I>value</I><BR>getAttribute("name")&nbsp;返回和原始文档中完全相同的内容（和扩展的实体）。&nbsp;<BR>attrNode.nodeTyped<I>value</I>&nbsp;Null&nbsp;<BR>attrNode.text&nbsp;除了前导和尾部的空白字符已经截断之外，其他与&nbsp;node<I>value</I>&nbsp;相同。&nbsp;</P>
<P><BR>“XML&nbsp;语言”规范为&nbsp;XML&nbsp;应用程序定义了下列行为：属性类型&nbsp;返回的文本&nbsp;<BR>CDATA&nbsp;ID、IDREF、IDREFS、ENTITY、ENTITIES、NOTATION、枚举&nbsp;<BR>半规范化&nbsp;全规范化&nbsp;<BR>在此半规范化代表将新行和&nbsp;tab&nbsp;字符转换为空格，但是多个空格不会退化为一个空格。</P>
<P>在&nbsp;XML&nbsp;对象模型中如何处理空白字符？&nbsp;</P>
<P>有些时候，XML&nbsp;对象模型将显示包含空白字符的&nbsp;TEXT&nbsp;节点。空白字符被截断后，多半会带来一些混乱。例如下面的&nbsp;XML&nbsp;例子：</P>
<P>&lt;?xml&nbsp;version="1.0"&nbsp;?&gt;<BR>&lt;!DOCTYPE&nbsp;person&nbsp;[<BR>&nbsp;&nbsp;&lt;!ELEMENT&nbsp;person&nbsp;(#PCDATA|lastname|firstname)&gt;<BR>&nbsp;&nbsp;&lt;!ELEMENT&nbsp;lastname&nbsp;(#PCDATA)&gt;<BR>&nbsp;&nbsp;&lt;!ELEMENT&nbsp;firstname&nbsp;(#PCDATA)&gt;<BR>]&gt;<BR>&lt;person&gt;<BR>&nbsp;&nbsp;&lt;lastname&gt;Smith&lt;/lastname&gt;<BR>&nbsp;&nbsp;&lt;firstname&gt;John&lt;/firstname&gt;<BR>&lt;/person&gt;</P>
<P>生成下列树：</P>
<P>Processing&nbsp;Instruction:&nbsp;xml<BR>DocType:&nbsp;person<BR>ELEMENT:&nbsp;person<BR>&nbsp;TEXT:&nbsp;<BR>&nbsp;ELEMENT:&nbsp;lastname<BR>&nbsp;TEXT:&nbsp;<BR>&nbsp;ELEMENT:&nbsp;firstname<BR>&nbsp;TEXT:&nbsp;</P>
<P>名字和姓氏两边是只包含空白字符的&nbsp;TEXT&nbsp;节点，因为“person”元素的内容模型是&nbsp;MIXED；它包含&nbsp;#PCDATA&nbsp;关键字。MIXED&nbsp;内容模型指定元素之间可以有文本存在。因此，下面的内容也是正确的：</P>
<P>&lt;person&gt;<BR>My&nbsp;last&nbsp;name&nbsp;is&nbsp;&lt;lastname&gt;Smith&lt;/lastname&gt;&nbsp;and&nbsp;my&nbsp;first&nbsp;name&nbsp;is<BR>&lt;firstname&gt;John&lt;/firstname&gt;<BR>&lt;/person&gt;</P>
<P>结果是类似于下面的树：</P>
<P>ELEMENT:&nbsp;person<BR>&nbsp;TEXT:&nbsp;My&nbsp;last&nbsp;name&nbsp;is<BR>&nbsp;ELEMENT:&nbsp;lastname<BR>&nbsp;TEXT:&nbsp;and&nbsp;my&nbsp;first&nbsp;name&nbsp;is<BR>&nbsp;ELEMENT:&nbsp;firstname<BR>&nbsp;TEXT:&nbsp;</P>
<P>如果没有单词“is”之后和&nbsp;&lt;lastname&gt;之前的空白字符，以及&nbsp;&lt;/lastname&gt;之后和单词“and”之前的空白字符，那么句子便无法理解。因此，对于&nbsp;MIXED&nbsp;内容模型来说，文字组合、空白字符和元素都是相关的。对于非&nbsp;MIXED&nbsp;内容模型来说则不是这样。</P>
<P>要使只有空白字符的&nbsp;TEXT&nbsp;节点消失，请从“person”元素声明中删除&nbsp;#PCDATA&nbsp;关键字：</P>
<P>&lt;!ELEMENT&nbsp;person&nbsp;(lastname,firstname)&gt;</P>
<P>结果是下面清晰的树：</P>
<P>Processing&nbsp;Instruction:&nbsp;xml<BR>DocType:&nbsp;person<BR>ELEMENT:&nbsp;person<BR>&nbsp;ELEMENT:&nbsp;lastname<BR>&nbsp;ELEMENT:&nbsp;firstname</P>
<P><BR>XML&nbsp;声明做什么？&nbsp;</P>
<P>XML&nbsp;声明必须列在&nbsp;XML&nbsp;文档的顶部：</P>
<P>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="utf-8"?&gt;<BR>它指定下面的项目：</P>
<P>该文档是&nbsp;XML&nbsp;文档。在丢失或者还没有指定&nbsp;MIME&nbsp;类型时&nbsp;MIME&nbsp;探测器可以用它来检测文件是否为类型&nbsp;text/xml。&nbsp;<BR>文档符合&nbsp;XML&nbsp;1.0&nbsp;规范。在以后&nbsp;XML&nbsp;有其他版本时这一点很重要。&nbsp;<BR>文档字符编码。编码属性是可选的，默认为&nbsp;UTF-8。&nbsp;<BR>注意：XML&nbsp;声明必须在&nbsp;XML&nbsp;文档的第一行，因此下面的&nbsp;XML&nbsp;文件：</P>
<P>&lt;!--HEADLINE="Dow&nbsp;closes&nbsp;as&nbsp;techs&nbsp;get&nbsp;hammered"--&gt;<BR>&lt;?xml&nbsp;version="1.0"?&gt;&nbsp;<BR>产生下面的分析错误：</P>
<P>无效的&nbsp;xml&nbsp;声明。<BR>行&nbsp;0000002:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;?xml&nbsp;version="1.0"?&gt;<BR>位置&nbsp;&nbsp;0000007:&nbsp;------^<BR>注意：XML&nbsp;声明是可选的。如果需要在顶部指定注释或者处理指令，那么请不要放入&nbsp;XML&nbsp;声明。但是，默认的编码将为&nbsp;UTF-8。</P>
<P>如何以可读格式打印我的&nbsp;XML&nbsp;文档？&nbsp;</P>
<P>在用&nbsp;DOM&nbsp;从零开始构造文档以产生&nbsp;XML&nbsp;文件时，任何内容都在一行上，相互之间没有空格。这是默认的行为。</P>
<P>构造在&nbsp;Internet&nbsp;Explorer&nbsp;5&nbsp;中的默认&nbsp;XSL&nbsp;样式表，以可读格式显示和打印&nbsp;XML&nbsp;文档。例如，如果已经安装了&nbsp;IE5，请尝试查看&nbsp;nospace.xml&nbsp;文件。浏览器中应该显示下面的树：</P>
<P>-&nbsp;&lt;ORDER&gt;<BR>&nbsp;-&nbsp;&lt;ITEM&nbsp;NAME="123"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;NAME&gt;XYZ&lt;/NAME&gt;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;PRICE&gt;12.56&lt;/PRICE&gt;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&lt;/ITEM&gt;&nbsp;<BR>&nbsp;&nbsp;&lt;/ORDER&gt;<BR>在&nbsp;XML&nbsp;中没有插入空白字符。</P>
<P>打印可读&nbsp;XML&nbsp;是非常有趣的，特别是有定义不同类型内容模型的&nbsp;DTD&nbsp;时。例如，在混合内容模型&nbsp;(#PCDATA)&nbsp;下不能插入空格，因为它可能改变内容的含义。比如请考虑下面的&nbsp;XML：</P>
<P>&lt;B&gt;E&lt;/B&gt;&lt;I&gt;lephant&lt;/I&gt;<BR>这最好不输出为：</P>
<P>&lt;B&gt;E&lt;/B&gt;<BR>&lt;I&gt;lephant&lt;/I&gt;<BR>因为单词边界不再正确。</P>
<P>所有这些都使自动化打印成为问题。如果不需要打印可读&nbsp;XML，那么可以使用&nbsp;DOM&nbsp;在适当的位置插入空白字符作为文本节点。</P>
<P><BR>如何在&nbsp;DTD&nbsp;中使用名称空间？&nbsp;要在&nbsp;DTD&nbsp;中使用名称空间，请在使用它的元素的&nbsp;ATTLIST&nbsp;声明中声明它，如下所示：</P>
<P>&lt;!ELEMENT&nbsp;x:customer&nbsp;ANY&nbsp;&gt;<BR>&lt;!ATTLIST&nbsp;x:customer&nbsp;xmlns:x&nbsp;CDATA&nbsp;#FIXED&nbsp;"urn:..."&gt;</P>
<P>名称空间类型必须为&nbsp;#FIXED。属性的名称空间也是这样：<BR>&lt;!ELEMENT&nbsp;customer&nbsp;ANY&nbsp;&gt;<BR>&lt;!ATTLIST&nbsp;customer<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x:<I>value</I>&nbsp;CDATA&nbsp;#IMPLIED<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:x&nbsp;CDATA&nbsp;#FIXED&nbsp;"urn:..."&gt;</P>
<P>名称空间和&nbsp;XML&nbsp;架构&nbsp;<BR>DTD&nbsp;和&nbsp;XML&nbsp;架构不能混合。例如，下面的</P>
<P>xmlns:x&nbsp;CDATA&nbsp;#FIXED&nbsp;"x-schema:myschema.xml"</P>
<P>将不导致使用在&nbsp;myschema.xml&nbsp;中定义的架构定义。对&nbsp;DTD&nbsp;和&nbsp;XML&nbsp;架构的使用是互斥的。</P>
<P>如何在&nbsp;Visual&nbsp;Basic&nbsp;中使用&nbsp;XMLDSO？&nbsp;</P>
<P>使用下面的&nbsp;XML&nbsp;作为例子：</P>
<P>&lt;contacts&gt;<BR>&nbsp;&lt;person&gt;<BR>&nbsp;&nbsp;&lt;name&gt;Mark&nbsp;Hanson&lt;/name&gt;&nbsp;<BR>&nbsp;&nbsp;&lt;telephone&gt;206&nbsp;765&nbsp;4583&lt;/telephone&gt;&nbsp;<BR>&nbsp;&lt;/person&gt;<BR>&nbsp;&lt;person&gt;<BR>&nbsp;&nbsp;&lt;name&gt;Jane&nbsp;Smith&lt;/name&gt;&nbsp;<BR>&nbsp;&nbsp;&lt;telephone&gt;425&nbsp;808&nbsp;1111&lt;/telephone&gt;&nbsp;<BR>&nbsp;&lt;/person&gt;<BR>&lt;/contacts&gt;<BR>可以按如下方式绑定到&nbsp;ADO&nbsp;记录集：</P>
<P>创建新的&nbsp;VB&nbsp;6.0&nbsp;项目。&nbsp;<BR>添加对&nbsp;Microsoft&nbsp;ActiveX&nbsp;Data&nbsp;Objects&nbsp;2.1&nbsp;或更高版本、Microsoft&nbsp;Data&nbsp;Adapter&nbsp;Library&nbsp;和&nbsp;Microsoft&nbsp;XML&nbsp;2.0&nbsp;版的引用。&nbsp;<BR>用下面的代码将&nbsp;XML&nbsp;数据加载到&nbsp;XML&nbsp;DSO&nbsp;控件中：<BR>Dim&nbsp;dso&nbsp;As&nbsp;New&nbsp;XMLDSOControl<BR>Dim&nbsp;doc&nbsp;As&nbsp;IXMLDOMDocument<BR>Set&nbsp;doc&nbsp;=&nbsp;dso.XMLDocument<BR>doc.Load&nbsp;("d:\test.xml")</P>
<P>用下面的代码将&nbsp;DSO&nbsp;映射到使用&nbsp;DataAdapter&nbsp;的新记录集对象中：<BR>Dim&nbsp;da&nbsp;As&nbsp;New&nbsp;DataAdapter<BR>Set&nbsp;da.Object&nbsp;=&nbsp;dso<BR>Dim&nbsp;rs&nbsp;As&nbsp;New&nbsp;ADODB.Recordset<BR>Set&nbsp;rs.DataSource&nbsp;=&nbsp;da<BR>访问数据：<BR>MsgBox&nbsp;rs.Fields("name").<I>value</I></P>
<P>结果显示字符串“Mark&nbsp;Hanson”&nbsp;<BR>如何在&nbsp;Java&nbsp;中使用&nbsp;XML&nbsp;DOM？&nbsp;</P>
<P>必须已经安装&nbsp;MSXML.DLL&nbsp;的&nbsp;IE5&nbsp;版本。在&nbsp;Visual&nbsp;J++&nbsp;6.0&nbsp;中，从项目菜单选择添加&nbsp;COM&nbsp;包装程序，然后从&nbsp;COM&nbsp;对象列表中选择“Microsoft&nbsp;XML&nbsp;1.0”。该操作将把所需的&nbsp;Java&nbsp;包装程序构造到称为“msxml”的新软件包中。这些预先构造的&nbsp;Java&nbsp;包装程序也可以下载。类可以按如下方法使用：</P>
<P>import&nbsp;com.ms.com.*;<BR>import&nbsp;msxml.*;<BR>public&nbsp;class&nbsp;Class1<BR>{<BR>&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main&nbsp;(String[]&nbsp;args)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;DOMDocument&nbsp;doc&nbsp;=&nbsp;new&nbsp;DOMDocument();<BR>&nbsp;&nbsp;&nbsp;&nbsp;doc.load(new&nbsp;Variant("<I>file:</I>//d:/samples/ot.xml"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Loaded&nbsp;"&nbsp;+&nbsp;doc.getDocumentElement().getNodeName());<BR>&nbsp;&nbsp;}<BR>}<BR>代码示例将从&nbsp;sun&nbsp;religion&nbsp;示例中加载&nbsp;3.8MB&nbsp;测试文件“ot.xml”。Variant&nbsp;类用于包装&nbsp;Win32&nbsp;VARIANT&nbsp;基本类型。</P>
<P>因为在每次检索节点时实际上都获得了新的包装程序，因此不能在节点上使用指针比较。因此，不要使用下面的代码，</P>
<P>IXMLDOMNode&nbsp;root1&nbsp;=&nbsp;doc.getDocumentElement();<BR>IXMLDOMNode&nbsp;root2&nbsp;=&nbsp;doc.getDocumentElement();<BR>if&nbsp;(root1&nbsp;==&nbsp;root2)...<BR>而要使用下面的代码：</P>
<P>if&nbsp;(ComLib.isEqualUnknown(root1,&nbsp;root2))&nbsp;....<BR>.class&nbsp;包装程序的总大小大约为&nbsp;160KB。但是，为了与&nbsp;W3C&nbsp;规范完全符合，应该只使用&nbsp;IXMLDOM*&nbsp;包装程序。下面的类是旧的&nbsp;IE&nbsp;4.0&nbsp;XML&nbsp;接口，可以从&nbsp;msxml&nbsp;文件夹中删除它们：</P>
<P>IXMLAttribute*,&nbsp;<BR>IXMLDocument*,&nbsp;XMLDocument*&nbsp;<BR>IXMLElement*,&nbsp;<BR>IXMLError*,&nbsp;<BR>IXMLElementCollection*,&nbsp;<BR>tagXMLEMEM_TYPE*&nbsp;<BR>_xml_error*&nbsp;<BR>这使大小减少为&nbsp;147KB。同时还可以删除下面的项目：</P>
<P>DOMFreeThreadedDocument<BR>在&nbsp;Java&nbsp;应用程序中从多个线程访问&nbsp;XML&nbsp;文档。&nbsp;<BR>XMLHttpRequest<BR>用&nbsp;XML&nbsp;DAV&nbsp;HTTP&nbsp;扩展与服务器通信。&nbsp;<BR>IXTLRuntime<BR>定义&nbsp;XSL&nbsp;样式表脚本对象。&nbsp;<BR>XMLDSOControl<BR>绑定到&nbsp;HTML&nbsp;页面中的&nbsp;XML&nbsp;数据。&nbsp;<BR>XMLDOMDocumentEvents<BR>在分析过程中返回回调。&nbsp;<BR>这可以将大小减少到&nbsp;116KB。要使它更小，请考虑&nbsp;DOM&nbsp;本身有两层的事实：核心层包括：</P>
<P>DOMDocument,&nbsp;IXMLDOMDocument&nbsp;<BR>IXMLDOMNode*&nbsp;<BR>IXMLDOMNodeList*&nbsp;<BR>IXMLDOMNamedNodeMap*&nbsp;<BR>IXMLDOMDocumentFragment*&nbsp;<BR>IXMLDOMImplementation&nbsp;<BR>IXMLDOMParseError&nbsp;<BR>和用户可能需要保留的&nbsp;DTD&nbsp;信息：</P>
<P>IXMLDOMDocumentType&nbsp;<BR>IXMLDOMEntity&nbsp;<BR>IXMLDOMNotation&nbsp;<BR>XML&nbsp;文档中的所有节点类型都是&nbsp;IXMLDOMNode，它提供全部功能，但是存在每种节点类型的更高级别的包装程序。因此，如果修改&nbsp;DOMDocument&nbsp;包装程序并将这些特定类型更改为使用&nbsp;IXMLDOMNode，那么所有下面的接口都可以删除：</P>
<P>IXMLDOMAttribute&nbsp;<BR>IXMLDOMCDATASection&nbsp;<BR>IXMLDOMCharacterData&nbsp;<BR>IXMLDOMComment&nbsp;<BR>IXMLDOMElement&nbsp;<BR>IXMLDOMProcessingInstruction&nbsp;<BR>IXMLDOMEntityReference&nbsp;<BR>IXMLDOMText&nbsp;<BR>删除这些将使大小减少到&nbsp;61KB。但是，对&nbsp;IXMLDOMElement&nbsp;来说，getAttribute&nbsp;和&nbsp;setAttribute&nbsp;方法都是有用的。否则需要使用：</P>
<P>IXMLDOMNode.getAttributes().setNamedItem(...)<BR></P></DIV></DIV>
<BLOCKQUOTE></BLOCKQUOTE><BR>
<DIV id=googlead1 style="FLOAT: left" width="310" height="250"></DIV><img src ="http://www.blogjava.net/haogj/aggbug/33743.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/haogj/" target="_blank">haogj</a> 2006-03-05 20:34 <a href="http://www.blogjava.net/haogj/archive/2006/03/05/33743.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>