<?xml version="1.0" encoding="GB2312"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:admin="http://webns.net/mvcb/"
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">

	<channel>
		<title>
			<![CDATA[swingchen的博客]]>
		</title>
		<link>http://swingchen.bokee.com/index.html</link>
		<description>
			<![CDATA[欢迎访问swingchen的博客]]>
		</description>
		<dc:language>zh-cn</dc:language>
		<dc:creator>email</dc:creator>
		<dc:date>2007-09-17T02:38:46Z</dc:date>
		<admin:generatorAgent rdf:resource="http://blog.bokee.com.com" />
	
					<item>
				<title>
					<![CDATA[使用Flex Data Services 2中的RPC服务]]>
				</title>
				<link>http://swingchen.bokee.com/6458271.html</link>
				<description>
					<![CDATA[<p><h2 id="head-830ac3f95561e2b78b812c14cbb9dda4757586c4">原文</h2><span class="anchor" id="line-2"></span><p class="line867"><a class="http" href="http://www.adobe.com/devnet/flex/articles/rpc_service.html">Using RPC services in Flex Data Services 2</a> <span class="anchor" id="line-3"></span><span class="anchor" id="line-4"></span></p><p class="line867" /><h2 id="head-d6321bf01fcbd160ac3d5083f0461507ec7b6b4b">翻译</h2><span class="anchor" id="line-5"></span><span class="anchor" id="line-6"></span><p class="line874">Adobe Flex 2系列产品对开发者创建和管理面向服务的富因特网应用程序（RIAs）的方式做了几个重要改进。尽管Flex 封装（packaging）的改进使我们可以选择使用或者不使用服务器端组件来创建并部署Flex应用程序，但是Flex Data Services中的新的性能使得使用服务器端组件比任何时候都有价值。这篇文章通过着重描述Flex 1.5 和最新版本的Flex 2.0这二者的远程过程调用（remote, procedure call，RPC）之间的不同，对Flex Data Service 2中的新性能进行了概述。 <span class="anchor" id="line-7"></span>Flex Data Services 2消息框架包括几个可以让RPC 服务请求变得健壮的新的服务质量（quality-of-service）特性。首先，每个信道 （channel）在发送任何请求之前都会检查它是否可以和服务器成功通讯。第二，开发者可以为每个端点（endpoint）定义多个信道，这使得配置更加灵活并在第一个信道不可用的情况下可以转到另一个。消息框架也支持集群（clustered）环境，所以RPC服务可以利用冗余的环境来提供强壮的服务。 <span class="anchor" id="line-8"></span><span class="anchor" id="line-9"></span></p><p class="line874">Flex Data Services 2还提供了很多性能来提高应用程序的可维护性。一个定义服务的配置文件使开发者可以为服务添加和移除接收点（destination），配置信道端点，设置安全性来控制服务访问，为健壮的程序定义集群，以及调整日志（logging）来帮助调试。如果技术需求改变，新的配置格式也可以让开发者添加新的信道，服务，适配器（adapter），登录命令，和日志对象。 <span class="anchor" id="line-10"></span><span class="anchor" id="line-11"></span></p><p class="line862">Flex 1.5通过<a class="nonexistent" href="http://wiki.flexsearch.cn/RemoteObject">RemoteObject</a>, HTTPService, 和 <a class="nonexistent" href="http://wiki.flexsearch.cn/WebService">WebService</a> MXML标签为异步呼叫远程过程提供了三个API。这些服务称作RPC 服务而且开发者使用它们来创建有面向服务架构（service-oriented architecture，SOA）的应用程序。Flex Data Services 2在继续提供这些RPC服务的同时还引进了两个新的数据服务，这两个新的数据服务引入了新的性能和一个新的编程模型。所有的服务都基于新版本<a class="nonexistent" href="http://wiki.flexsearch.cn/ActionScript">ActionScript</a>（<a class="nonexistent" href="http://wiki.flexsearch.cn/ActionScript">ActionScript</a> 3.0）提供的一个公共消息体系。这篇文档描述了Flex 1.5和Flex 2之间的不同以及Flex Data Services 2中的RPC服务是如何利用这些改进的。 <span class="anchor" id="line-12"></span><span class="anchor" id="line-13"></span></p><p class="line867" /><h4 id="head-408b864ff8792efe4f46ab01c76743e8ccff932a">RPC服务和消息体系</h4><span class="anchor" id="line-14"></span><span class="anchor" id="line-15"></span><p class="line874">Flex 2中新的消息体系为RPC服务引进了几个新的概念。这一节从较高层次阐明了它与Flex 1.5的不同并且概要说明了Flex 2中与之等价的特性。 <span class="anchor" id="line-16"></span><span class="anchor" id="line-17"></span></p><p class="line862">在Flex 1.5中，开发者使用MXML标签来连接RPC服务。你可以指定几个属性，比如服务名，请求将要被发送到的端点等等。Flex 1.5中的各个RPC服务使用了不同的技术，所以每个服务的配置选项和术语都不一样。例如，一个<a class="nonexistent" href="http://wiki.flexsearch.cn/RemoteObject">RemoteObject</a>标签指定了命名的或未命名的源（source）并连接到一个Action Message Format（Action消息格式，AMF）网关，而HTTPService和<a class="nonexistent" href="http://wiki.flexsearch.cn/WebService">WebService</a>标签则使用命名的服务或原始的URL并使用基于文本的查询参数或XML连接到一个HTTP Proxy。 <span class="anchor" id="line-18"></span><span class="anchor" id="line-19"></span></p><p class="line862">Flex 2为这个模型引入了几个改进，使该模型在不同的信道之间更加一致，而且为开发者提供了更高的灵活性。在客户端，开发者可以使用MXML标签或纯<a class="nonexistent" href="http://wiki.flexsearch.cn/ActionScript">ActionScript</a> API来声明服务连接。如果连接只是在客户端，服务的URI会被指定为一个参数。如果连接利用了Flex Data Services，开发者就定义一个关联到所需服务的逻辑接收点（destination）。这些服务表现出各种各样截然不同的性能，比如间接web service呼叫和消息集成。在服务器端，所有的接收点都通过配置文件被配置好了。一个接收点包括了接收点所连接的端点的信息，所有连接都会使用的多种消息选项，以及用来通讯的信道。信道展现了一个通讯机制，比较有代表性地就是指定协议和一些诸如信道是否使用轮询（polling）和预期的轮询间隔之类的选项。 <span class="anchor" id="line-20"></span><span class="anchor" id="line-21"></span></p><p class="line862">这些各种各样的服务提供的所有通讯都经由一个将消息传递给适当的服务的公共消息代理。消息类型和选中的接收点（destination）被消息代理用来选择适当的服务并确保该服务可以处理这个消息。<a class="nonexistent" href="http://wiki.flexsearch.cn/RemoteObject">RemoteObject</a>消息被发送到<a class="nonexistent" href="http://wiki.flexsearch.cn/RemotingService">RemotingService</a>，而HTTPService和<a class="nonexistent" href="http://wiki.flexsearch.cn/WebService">WebService</a>消息被发送到<a class="nonexistent" href="http://wiki.flexsearch.cn/ProxyService">ProxyService</a>。表 1 把Flex 1.5的服务概念和Flex Data Services 2中与之等价的东西做了比较。 <span class="anchor" id="line-22"></span><span class="anchor" id="line-23"></span></p><div><table><tbody><tr style="BACKGROUND-COLOR: #ffffe0"><td style="TEXT-ALIGN: center" colspan="2"><p class="line891"><strong>表 1. Flex 1.5和 Flex Data Services 2 概念的比较</strong></p></td></tr><tr style="BACKGROUND-COLOR: #ffffe0"><td><span class="anchor" id="line-24"></span><p class="line891"><strong>Flex 1.5 Services概念</strong> </p></td><td><p class="line891"><strong>Flex Data Services 2 中的等价物</strong> </p></td></tr><tr><td style="VERTICAL-ALIGN: top"><span class="anchor" id="line-25"></span><p class="line891"><em>命名的和未命名的服务（Named and Unnamed Services）</em><br /><br />在Flex1.5中，鼓励开发者赋予服务一个名字来作为别名；但是，客户端也可以通过未命名的方式动态地提供一个服务的细节（比如一个第三方URL，或是一个对象的源文件） </p></td><td style="VERTICAL-ALIGN: top"><p class="line891"><em>接收点（Destinations）</em><br /><br />一个接收点等同于Flex1.5中的一个命名的服务。接收点是指最终的端点。所有的请求必须被发送到相关服务（Remoting Service, Proxy Service, Message Service, 和Data Service）的一个接收点。 </p></td></tr><tr><td style="VERTICAL-ALIGN: top"><span class="anchor" id="line-26"></span><p class="line891"><em>Proxy</em><br /><br />典型地，HTTPService和<a class="nonexistent" href="http://wiki.flexsearch.cn/WebService">WebService</a>请求的预期端点是一个远程的第三方服务。但是，Flash&reg; Player的安全沙盒（sandbox）把请求约束在程序加载的域中。为了避免在每一个远程站点都需要一个crossdomain.xml文件，Flex 1.5向开发者提供了一个内部的Proxy Servlet来把请求发送到合适的端点。</p></td><td style="VERTICAL-ALIGN: top"><p class="line891"><em>Proxy Service</em><br /><br />尽管HTTPService和<a class="nonexistent" href="http://wiki.flexsearch.cn/WebService">WebService</a>使用消息代理在Proxy Service中回复请求，安全沙盒（sandbox）限制仍然被应用到所有服务。 Prox Service不再被默认使用；useProxy属性的默认值是false。由于useProxy的值是false，消息代理并没有联系而且destination属性也没有用到。作为替代的是，开发者必须为HTTPService标签设置url属性或为<a class="nonexistent" href="http://wiki.flexsearch.cn/WebService">WebService</a>标签定义wsdl属性。开发者通过选取一个特定的直接信道来把不是基于消息的请求发送到第三方端点。 为了使用proxy，开发者必须在HTTPService或<a class="nonexistent" href="http://wiki.flexsearch.cn/WebService">WebService</a>中设定useProxy为true。在HTTPService或<a class="nonexistent" href="http://wiki.flexsearch.cn/WebService">WebService</a>中设定接收点就会自动把useProxy设置为true。使用<a class="nonexistent" href="http://wiki.flexsearch.cn/ProxyService">ProxyService</a>的时候，可以对任何信道发送请求。信道被注册为消息代理的端点。基于HTTP的信道发送消息到一个消息代理servlet。基于实时消息协议（RTMP）的信道发送消息来指定TCP/IP端口；消息代理管理监听这些端口的socket。</p></td></tr><tr><td style="VERTICAL-ALIGN: top"><span class="anchor" id="line-27"></span><p class="line891"><em>AMF 网关</em><br /><br /><a class="nonexistent" href="http://wiki.flexsearch.cn/RemoteObject">RemoteObject</a>请求的端点是一个AMF网关servlet</p></td><td style="VERTICAL-ALIGN: top"><p class="line891"><em>Remoting Service</em><br /><br />没有为<a class="nonexistent" href="http://wiki.flexsearch.cn/RemoteObject">RemoteObject</a>指定信道；可以通过任何信道向Remoting Service发送请求。</p></td></tr></tbody></table></div><span class="anchor" id="line-28"></span><span class="anchor" id="line-29"></span><span class="anchor" id="line-30"></span><p class="line867" /><h4 id="head-84e84abad3bd77d80a0f95d67be841c141a604a5">RPC服务配置</h4><span class="anchor" id="line-31"></span><span class="anchor" id="line-32"></span><p class="line862">在Flex 1.5中，编译器和运行时服务的配置设置都在同一个配置文件，flex-config.xml中。这个配置文件有三个部分用于RPC服务：&lt;remote-objects&gt;用于<a class="nonexistent" href="http://wiki.flexsearch.cn/RemoteObject">RemoteObject</a>标签，&lt;web-service-proxy&gt;用于<a class="nonexistent" href="http://wiki.flexsearch.cn/WebService">WebService</a>标签，&lt;http-service-proxy&gt;用于HTTPService标签。Flex在编译时使用这些服务配置信息来为MXML标签生成代码并验证标签属性。下面的例子展示了Flex 1.5配置文件，flex-config.xml的结构。 <span class="anchor" id="line-33"></span><span class="anchor" id="line-34"></span></p><p class="line867"><span class="anchor" id="line-35"></span><span class="anchor" id="line-36"></span><span class="anchor" id="line-37"></span><span class="anchor" id="line-38"></span><span class="anchor" id="line-39"></span><span class="anchor" id="line-40"></span><span class="anchor" id="line-41"></span><span class="anchor" id="line-42"></span><span class="anchor" id="line-43"></span><span class="anchor" id="line-44"></span><span class="anchor" id="line-45"></span><span class="anchor" id="line-46"></span></p>]]>
				</description>
				<guid isPermaLink="false">
					6458271@http://swingchen.bokee.com/
				</guid>
				<dc:subject></dc:subject>
				<dc:date>2007-09-16  16:23</dc:date>
			</item>
					<item>
				<title>
					<![CDATA[加密/解密基本机理]]>
				</title>
				<link>http://swingchen.bokee.com/6309241.html</link>
				<description>
					<![CDATA[<p><p class="a14">(转载)</p><p class="a14">因为Web Service是靠SOAP协议进行传输信息的，所以对Web Service的加密就是对SOAP消息进行加密，通过SOAP协议扩展,可以实现这一点。数据在网络上传输，重要的一点是保证它的正确 性和完整性，并且要防止被无意或恶意的修改，窃取。Web Service中提供的加密模式有多少呢？怎样实现的呢？</p><p class="a14">加密将防止数据被查看或修改，并在原本不安全的信道上提供安全的通讯信道。例如，可以使用加密算法对数据进行加密，在加密状态下传输数据，然后由预定的接收方对数据进行解密。如果第三方截获了加密的数据，将难以解密该数据。</p><p class="a14">在一个使用加密的典型场合中，双方（小红和小明）在不安全的信道上通讯。小红和小明想要确保任何可能正在侦听的人无法理解他们之间的通讯。而且，由于小红和小明相距遥远，因此小红必须确保她从小明处收到的信息没有在传输期间被任何人修改。此外，她必须确定信息确实是发自小明而不是有人模仿小明发出的。</p><p class="a14">加密用于达到以下目的： </p><ul><li><p class="a14">&nbsp;保密性：防止用户的标识或数据被读取。 </p></li><li><p class="a14">数据完整性：防止数据被更改。 </p></li><li><p class="a14">身份验证：确保数据发自特定的一方。 </p></li></ul><p class="a14">为了达到这些目的，小红和小明使用算法和惯例的组合（称作加密基元）来创建加密方案。下表列出了加密基元及它们的用法。</p><table cellspacing="1" width="80%" border="1"><tbody><tr><td width="50%"><b>加密基元</b></td><td width="50%"><b>使用</b></td></tr><tr><td width="50%">私钥加密（对称加密）</td><td width="50%">对数据执行转换，使第三方无法读取该数据。此类型的加密使用单个共享的机密密钥来加密和解密数据。</td></tr><tr><td width="50%">公钥加密（不对称加密）</td><td width="50%">对数据执行转换，使第三方无法读取该数据。此类加密使用公钥/私钥对来加密和解密数据。</td></tr><tr><td width="50%">加密签名</td><td width="50%">通过创建对特定的一方唯一的数字签名来确保数据发自该特定方。此过程还使用哈希函数。</td></tr><tr><td width="50%">加密哈希</td><td width="50%">将数据从任意长度映射为定长字节序列。哈希在统计上是唯一的；不同的双字节序列不会哈希为同一个值。</td></tr></tbody></table><p class="a14"><b>私钥加密</b></p><p class="a14">私钥加密算法使用单个私钥来加密和解密数据。由于具有密钥的任意一方都可以使用该密钥解密数据，因此必须保护密钥不被未经授权的代理得到。私钥加密也称为对称加密，原因是同一密钥既用于加密又用于解密。私钥加密算法非常快（与公钥算法相比）并特别适合于对大型数据流执行加密转换。</p><p class="a14">通常，私钥算法（称为块密码）用于一次加密一个数据块。块密码（如 RC2、DES、TrippleDES 和 Rijndael）通过加密将 n 字节的输入块转换为加密字节的输出块。如果要加密或解密字节序列，必须逐块进行。由于 n 的大小很小（对于 RC2、DES 和 TripleDES，n = 8 字节；n = 16 [默认值]；n = 24；对于 Rijndael，n = 32），因此必须对大于 n 字节的值一次加密一个块。 </p><p class="a14">基类库中提供的块密码类使用称作密码块链 (CBC) 的链模式，它使用一个密钥和一个初始化向量 (IV) 对数据执行加密转换。对于给定的私钥 k，不使用初始化向量的简单块密码将把相同的明文输入块加密为同样的密文输出块。如果在明文流内有重复的块，那么在密文流内也会有重复的块。如果未经授权的用户知道有关明文块的结构的所有信息，就可以使用该信息解密已知的密文块并有可能获得您的密钥。若要克服这个问题，可将上一个块中的信息混合到加密下一个块的过程中。这样，两个相同的明文块的输出就会不同。由于该技术使用上一个块加密下一个块，因此使用了一个 IV 来加密数据的第一个块。使用该系统，未经授权的用户有可能知道的公共消息标头将无法用于对密钥进行反向工程。</p><p class="a14">可以危及用此类型密码加密的数据的一个方法是，对每个可能的密钥执行穷举搜索。根据用于执行加密的密钥大小，即使使用最快的计算机执行这种搜索，也极其耗时，因此难以实施。使用较大的密钥大小将使解密更加困难。虽然从理论上说加密不会使对手无法检索加密的数据，但它确实极大增加了这样做的成本。如果执行彻底搜索来检索只在几天内有意义的数据需要花费三个月的时间，那么穷举搜索的方法是不实用的。</p><p class="a14">私钥加密的缺点是它假定双方已就密钥和 IV 取得了一致，并且互相传达了密钥和 IV 的值。并且，密钥必须对未经授权的用户保密。由于这些问题，私钥加密通常与公钥加密一起使用以秘密地传达密钥和 IV 的值。</p><p class="a14">假设小红和小明是要在不安全的信道上进行通讯的双方，他们可能以如下方式使用私钥加密。小红和小明都同意使用一种具有特定密钥和 IV 的特定算法（如 Rijndael）。小红撰写一条消息并创建要在其上发送该消息的网络流。接下来，她使用该密钥和 IV 加密该文本，并通过 Internet 发送该文本。她没有将密钥和 IV 发送给小明。小明收到该加密文本并使用预先商定的密钥和 IV 对它进行解密。如果该传输被截获，截获者将无法恢复原始消息，原因是截获者不知道密钥或 IV。在这个方案中，密钥必须保密，但 IV 不需要保密。在实际的方案中，由小红或小明生成私钥并使用公钥（不对称）加密将该私有（对称）密钥传递给对方。有关更多信息，请参阅“公钥加密”。</p><p class="a14">.NET 框架提供以下实现私钥加密算法的类： </p><ul><li><p class="a14">DESCryptoServiceProvider </p></li><li><p class="a14">RC2CryptoServiceProvider </p></li><li><p class="a14">RijndaelManaged </p></li><li><p class="a14">TripleDESCryptoServiceProvider </p></li></ul><p class="a14"><b>公钥加密</b></p><p class="a14">公钥加密使用一个必须对未经授权的用户保密的私钥和一个可以对任何人公开的公钥。公钥和私钥都在数学上相关联；用公钥加密的数据只能用私钥解密，而用私钥签名的数据只能用公钥验证。公钥可以被任何人使用；该密钥用于加密要发送到私钥持有者的数据。两个密钥对于通讯会话都是唯一的。公钥加密算法也称为不对称算法，原因是需要用一个密钥加密数据而需要用另一个密钥来解密数据。</p><p class="a14">公钥加密算法使用固定的缓冲区大小，而私钥加密算法使用可变长度的缓冲区。公钥算法无法像私钥算法那样将数据链接在一起而成为流，原因是只可以加密少量数据。因此，不对称操作不使用与对称操作相同的流模型。</p><p class="a14">使用公钥加密，双方（小红和小明）可能以如下方式使用公钥加密。首先，小红生成一个公钥/私钥对。如果小明想要给小红发送一条加密的消息，他将向她索要她的公钥。小红通过不安全的网络将她的公钥发送给小明，小明接着使用该密钥加密消息。（如果小明在不安全的信道如公共网络上收到小红的密钥，则小明必须同小红验证他具有她的公钥的正确副本。）小明将加密的消息发送给小红，而小红使用她的私钥解密该消息。</p><p class="a14">但是，在传输小红的公钥期间，未经授权的代理可能截获该密钥。而且，同一代理可能截获来自小明的加密消息。但是，该代理无法用公钥解密该消息。该消息只能用小红的私钥解密，而该私钥没有被传输。小红不使用她的私钥加密给小明的答复消息，原因是任何具有该公钥的人都可以解密该消息。如果小红想要将消息发送回小明，她将向小明索要他的公钥并使用该公钥加密她的消息。然后，小明使用与他相关联的私钥来解密该消息。</p><p class="a14">在实际的方案中，小红和小明使用公钥（不对称）加密来传输私（对称）钥，并对他们其余的会话使用私钥加密。</p><p class="a14">公钥加密具有更大的密钥空间（或密钥的可能值范围），因此不大容易受到对每个可能密钥都进行尝试的穷举攻击的影响。由于不必保护公钥，因此它易于分发。公钥算法可用于创建数字签名以验证数据发送方的标识。但是，公钥算法非常缓慢（与私钥算法相比），而且不是为加密大量数据而设计的。公钥算法仅对传输很少量的数据有用。通常，公钥加密用于加密私钥算法要使用的密钥和 IV。传输密钥和 IV 后，私钥加密将用于该会话的其余部分。</p><p class="a14">.NET 框架提供以下实现公钥加密算法的类： </p><ul><li><p class="a14">DSACryptoServiceProvider </p></li><li><p class="a14">RSACryptoServiceProvider </p></li></ul><p class="a14"><b>数字签名</b></p><p class="a14">公钥算法还可用于构成数字签名。数字签名验证发送方的标识（如果您信任发送方的公钥）并保护数据的完整性。使用由小红生成的公钥，小红的数据的接收者可以通过将数字签名与小红的数据和小红的公钥进行比较来验证是否是小红发送了该数据。</p><p class="a14">为了使用公钥加密对消息进行数字签名，小红首先将哈希算法应用于该消息以创建消息摘要。该消息摘要是数据的紧凑且唯一的表示形式。然后，小红用她的私钥加密该消息摘要以创建她的个人签名。在收到该消息和签名时，小明使用小红的公钥解密签名以恢复该消息摘要，并使用与小红所使用的相同的哈希算法来散列该消息。如果小明计算的消息摘要与从小红那里收到的消息摘要完全一致，小明就可以确定该消息来自私钥的持有人，并且数据未被修改过。如果小明相信小红是私钥的持有人，则他知道该消息来自小红。</p><p class="a14">请注意，由于发送方的公钥为大家所周知，并且它通常包含在数字签名格式中，因此任何人都可以验证签名。此方法不保守消息的机密；若要使消息保密，还必须对消息进行加密。</p><p class="a14">.NET 框架提供以下实现数字签名算法的类： </p><ul><li><p class="a14">DSACryptoServiceProvider </p></li><li><p class="a14">RSACryptoServiceProvider </p></li></ul><p class="a14"><b>哈希值</b></p><p class="a14">哈希算法将任意长度的二进制值映射为固定长度的较小二进制值，这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母，随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入，在计算上是不可能的。</p><p class="a14">消息身份验证代码 (MAC) 哈希函数通常与数字签名一起用于对数据进行签名，而消息检测代码 (MDC) 哈希函数则用于数据完整性。</p><p class="a14">小红和小明可能以下面的方式使用哈希函数以确保数据完整性。如果小红对小明编写一条消息并创建该消息的哈希，则小明可以在稍后散列该消息并将他的哈希与原始哈希进行比较。如果两个哈希值相同，则该消息没有被更改；但是，如果值不相同，则该消息在小红编写它之后已被更改。为了使此系统运行，小红必须对除小明外的所有人保密原始的哈希值。</p><p class="a14">.NET 框架提供以下实现数字签名算法的类： </p><ul><li><p class="a14">HMACSHA1 </p></li><li><p class="a14">MACTripleDES </p></li><li><p class="a14">MD5CryptoServiceProvider </p></li><li><p class="a14">SHA1Managed </p></li><li><p class="a14">SHA256Managed </p></li><li><p class="a14">SHA384Managed </p></li><li><p class="a14">SHA512Managed </p></li></ul><p class="a14"><b>随机数生成</b></p><p class="a14">随机数生成是许多加密操作不可分割的组成部分。例如，加密密钥需要尽可能地随机，以便使它们很难被复制。加密随机数生成器必须生成在计算上无法进行推算（低于 p &lt; .05 的概率）的输出；即，任何推算下一个输出位的方法不得具有比随机猜测更高的成功几率。.NET 框架中的类使用随机数生成器生成加密密钥。</p><p class="a14">RNGCryptoServiceProvider 是随机数生成器算法的实现。</p><p class="a14">Web Service的加密模型有：</p><p class="a14"><b>对象继承</b></p><p class="a14">.NET 框架安全系统实现可扩展模式的派生类继承。层次结构如下所示：</p><ul><li><p class="a14">算法类型类，如 SymmetricAlgorithm 或 HashAlgorithm。该级别为抽象。 </p></li><li><p class="a14">算法类从算法类型类继承，如 RC2 或 SHA1。该级别为抽象。 </p></li><li><p class="a14">算法类的实现从算法类继承，如 RC2CryptoServiceProvider 或 SHA1Managed。该级别是完全实现的。 </p></li></ul><p class="a14">使用这种模式的派生类，很容易添加新算法或现有算法的新实现。例如，若要创建新的公钥算法，可从 AsymmetricAlgorithm 继承。若要创建特定算法的新实现，可创建该算法的非抽象派生类。</p><p class="a14"><b>流设计</b></p><p class="a14">公共语言运行库使用面向流的设计实现对称算法和哈希算法。该设计的核心是 CryptoStream，它是从 Stream 类派生的类。基于流的加密对象全都支持用于处理对象的数据传输部分的单个标准接口 (CryptoStream)。由于所有对象都在标准接口上生成，所以可以将多个对象（如一个哈希对象后跟一个加密对象）链接在一起，并且可以对数据执行多个操作而不需要为其提供任何中间存储。使用流模型时还可以用更小的对象生成对象。例如，可以将加密算法和哈希算法的组合视为单个流对象（即使该对象可能是从一组流对象生成的）。</p><p class="a14"><b>加密配置</b></p><p class="a14">使用加密配置可以将算法的特定实现解析为算法名称，从而使 .NET 框架加密类具有可扩展性。您可以添加自己的硬件或软件算法实现，并将该实现映射到您选择的算法名称上。如果未在配置文件中指定算法，则使用默认设置。</p><p class="a14">在SOAP协议中可以在配置文件中指定，在传输时加密要传输的数据，在接收端解密SOAP消息，详情可见SOAP协议扩展方面的文档。</p><p class="a14">ip:202.114.105.17</p><p class="a14">网关：202.114.105.254</p><p class="a14">dns：202.114.96.1&nbsp;&nbsp; 202.114.96.2</p><p class="a14">主机：home</p></p>]]>
				</description>
				<guid isPermaLink="false">
					6309241@http://swingchen.bokee.com/
				</guid>
				<dc:subject></dc:subject>
				<dc:date>2007-06-4  11:02</dc:date>
			</item>
					<item>
				<title>
					<![CDATA[Too many open files 解决方法 ]]>
				</title>
				<link>http://swingchen.bokee.com/6303471.html</link>
				<description>
					<![CDATA[<p><p><b>Redhat 帮助文档[http://kbase.redhat.com/faq/FAQ_80_1540.shtm]</b> <br />Issue: <br />How do I set the maximum number of files allowed to be open on a system <br />Resolution: <br />The current setting for maximum number of open files can be viewed with the command:</p><p>ulimit -n</p><p>This number indicates the maximum number of files normal users (i.e. non-root) can have open in a single session. Note that for the root user, ulimit -n will sometimes output 1024 even after following the procedure to increase the maximum number of open files. This won't effect root's ability to open large numbers of files, as only normal users are bound by this value.</p><p>To increase the maximum number of open files beyond the default of 1024, two changes to the system may be necessary. In these examples, we will increase the maximum number of open files to the arbitrary value of 2048. All changes need to be made by the root user and users will need to log out and log back in before the changes will take effect.</p><p>1. Configure the system to accept the desired value for maximum number of open files Check the value in /proc/sys/fs/file-max to see if it is larger than the value needed for the maximum number of open files:</p><p># cat /proc/sys/fs/file-max</p><p>If the value isn't large enough, echo an appropriate number into the variable and add the change to /etc/sysctl.conf to make it persistent across reboots. If the number is already larger than the value you wish to use, skip to step 2.</p><p># echo 2048 &gt; /proc/sys/fs/file-max</p><p>and edit /etc/sysctl.conf to include the line:</p><p>fs.file-max = 2048</p><p>2. Set the value for maximum number of open files In the file /etc/security/limits.conf, below the commented line that reads</p><p>#<domain /> <type /><item /><value /></p><p>add this line:</p><p>* - nofile 2048</p><p>This line sets the default number of open file descriptors for every user on the system to 2048. Note that the &quot;nofile&quot; item has two possible limit values under the <type />header: hard and soft. Both types of limits must be set before the change in the maximum number of open files will take effect. By using the &quot;-&quot; character, both hard and soft limits are set simultaneously.</p><p>The hard limit represents the maximum value a soft limit may have and the soft limit represents the limit being actively enforced on the system at that time. Hard limits can be lowered by normal users, but not raised and soft limits cannot be set higher than hard limits. Only root may raise hard limits. </p><p>When increasing file limit descriptors, you may want to simply double the value. For example, if you need to increase the default value of 1024, increase the value to 2048 first. If you need to increase it again, try 4096, etc.</p><p>================================================================== <br />1。ulimit -a 查看系统目前资源限制的设定。 <br />[root@test security]# ulimit -a <br />core file size (blocks, -c) 0 <br />data seg size (kbytes, -d) unlimited <br />file size (blocks, -f) unlimited <br />max locked memory (kbytes, -l) unlimited <br />max memory size (kbytes, -m) unlimited <br />open files (-n) 1024 <br />pipe size (512 bytes, -p) 8 <br />stack size (kbytes, -s) 8192 <br />cpu time (seconds, -t) unlimited <br />max user processes (-u) 7168 <br />virtual memory (kbytes, -v) unlimited <br />[root@test security]# <br />通过以上命令，我们可以看到open files 的最大数为1024 <br />那么我们可以通过一下命令修改该参数的最大值 <br />2. ulimit -n 4096 <br />[root@test security]# ulimit -n 4096 <br />[root@test security]# ulimit -a <br />core file size (blocks, -c) 0 <br />data seg size (kbytes, -d) unlimited <br />file size (blocks, -f) unlimited <br />max locked memory (kbytes, -l) unlimited <br />max memory size (kbytes, -m) unlimited <br />open files (-n) 4096 <br />pipe size (512 bytes, -p) 8 <br />stack size (kbytes, -s) 8192 <br />cpu time (seconds, -t) unlimited <br />max user processes (-u) 7168 <br />virtual memory (kbytes, -v) unlimited</p><p>这样我们就修改了系统在同一时间打开文件资源的最大数，基本解决以上问题。</p><p>另外我们可以通过lsof -p [进程的 pid]来查看系统当前打开的文件资源，可以了解不同时期系统的文件资源的使用情况，可根据情况进行系统资源的配置。 <br />=================================================================== <br />从这里学到的linux的命令 <br />查看进程所占的文件描述符 lsof -p 390 | wc -l <br />查看系统的各种资源限制或者更改这个限制 ulimit -a </p></p>]]>
				</description>
				<guid isPermaLink="false">
					6303471@http://swingchen.bokee.com/
				</guid>
				<dc:subject></dc:subject>
				<dc:date>2007-05-31  16:57</dc:date>
			</item>
					<item>
				<title>
					<![CDATA[Flex及Apollo开发资源下载]]>
				</title>
				<link>http://swingchen.bokee.com/6285199.html</link>
				<description>
					<![CDATA[<p><p>客户端</p><p>Flex Builder 2 with Charting<br />官方下载：<a href="http://www.adobe.com/go/tryflex">http://www.adobe.com/go/tryflex</a>&nbsp; （需要有Adobe帐号，登录后选择你需要的版本进行下载）<br />本地下载：<a href="http://211.155.21.54:83/software/FLXB_2.0_Win_WWE.exe">http://211.155.21.54:83/software/FLXB_2.0_Win_WWE.exe</a></p><p>Flex SDK<br />官方下载：<a href="http://www.adobe.com/go/tryflex">http://www.adobe.com/go/tryflex</a>&nbsp; （需要有Adobe帐号，登录后选择你需要的版本进行下载）<br />本地下载：<a href="http://211.155.21.54:83/software/flex_sdk_2.zip">http://211.155.21.54:83/software/flex_sdk_2.zip</a></p><p>Flex Charting 2<br />官方下载：<a href="http://www.adobe.com/go/tryflex">http://www.adobe.com/go/tryflex</a>&nbsp; （需要有Adobe帐号，登录后选择你需要的版本进行下载）<br />本地下载：<a href="http://211.155.21.54:83/software/FCC2_MLP_WWE.zip">http://211.155.21.54:83/software/FCC2_MLP_WWE.zip</a></p><p>Apollo Extension for Adobe Flex Builder 2.0.1 (alpha 1)<br />官方下载：<a href="http://www.adobe.com/cfusion/entitlement/index.cfm?e=labs%5Fapollo">http://www.adobe.com/cfusion/entitlement/index.cfm?e=labs%5Fapollo</a>&nbsp; （需要有Adobe帐号，登录喉选择你需要的版本进行下载）<br />本地下载：<a href="http://211.155.21.54:83/software/fb_apollo_extensions_win_alpha1_031907.exe">http://211.155.21.54:83/software/fb_apollo_extensions_win_alpha1_031907.exe</a></p><p>Apollo SDK (alpha 1)<br />官方下载：<a href="http://www.adobe.com/cfusion/entitlement/index.cfm?e=labs%5Fapollo">http://www.adobe.com/cfusion/entitlement/index.cfm?e=labs%5Fapollo</a>&nbsp; （需要有Adobe帐号，登录喉选择你需要的版本进行下载）<br />本地下载：<a href="http://211.155.21.54:83/software/apollo_sdk_alpha1_031907.zip">http://211.155.21.54:83/software/apollo_sdk_alpha1_031907.zip</a></p><p>Apollo Runtime (alpha 1)<br />官方下足载：<a href="http://www.adobe.com/go/apollo_p1_runtime_win">http://www.adobe.com/go/apollo_p1_runtime_win</a><br />本地下载：<a href="http://211.155.21.54:83/software/apollo_win_alpha1_031907.msi">http://211.155.21.54:83/software/apollo_win_alpha1_031907.msi</a></p><p /><p><br />服务器端</p><p>Flex Data Services<br />官方下载：<a href="http://www.adobe.com/go/tryflex">http://www.adobe.com/go/tryflex</a>&nbsp; （需要有Adobe帐号，登录后选择你需要的版本进行下载）<br />本地下载：<a href="http://211.155.21.54:83/software/fds2-win.exe">http://211.155.21.54:83/software/fds2-win.exe</a></p><p>Adobe LiveCycle Data Services 2.5 Beta<br />官方下载：<a href="http://download.macromedia.com/pub/labs/livecycle_data_services/lcds25-b2-win_032007.exe">http://download.macromedia.com/pub/labs/livecycle_data_services/lcds25-b2-win_032007.exe</a></p><p /><p><br />升级包</p><p>Flex 2.0.1升级包<br />官方下载：<a href="http://download.macromedia.com/pub/flex/flex_builder/flexbuilder2_201updater.exe">http://download.macromedia.com/pub/flex/flex_builder/flexbuilder2_201updater.exe</a><br />本地下载：<a href="http://211.155.21.54:83/software/flexbuilder2_201updater.exe">http://211.155.21.54:83/software/flexbuilder2_201updater.exe</a></p><p>Flex 2.0.1 SDK HOTFIX 1<br />详情及安装说明请看：<a href="http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=kb401224">http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=kb401224</a><br />官方下载：<a href="http://www.adobe.com/support/flex/ts/documents/kb401224/flex2sdk_hf1_159086.zip">http://www.adobe.com/support/flex/ts/documents/kb401224/flex2sdk_hf1_159086.zip</a></p><p>Flex 2.0.1 patch for Flash CS3 Professional compatibility&nbsp; （NEW！）<br />详情及安装说明请看：<a href="http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=kb401493">http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=kb401493</a><br />官方下载：<a href="http://www.adobe.com/support/flex/ts/documents/kb401493/flex_201_patch_FINAL.zip">http://www.adobe.com/support/flex/ts/documents/kb401493/flex_201_patch_FINAL.zip</a></p><p /><p>文档和书籍</p><p>AS3 cookbook （从flex2.org收集）<br /><a href="http://211.155.21.54:83/e-book/AS3_cookbook_%5BFlex2.org%5D.chm">http://211.155.21.54:83/e-book/AS3_cookbook_%5BFlex2.org%5D.chm</a></p><p>Advanced.ActionScript.3.with.Design.Patterns （从flex2.org收集）<br /><a href="http://211.155.21.54:83/e-book/Advanced.ActionScript.3.with.Design.Patterns.Nov.2006_%5BFlex2.org%5D.chm">http://211.155.21.54:83/e-book/Advanced.ActionScript.3.with.Design.Patterns.Nov.2006_%5BFlex2.org%5D.chm</a></p><p>Adobe_Flex_2.0.1_Language_Reference（从flex2.org收集）<br /><a href="http://211.155.21.54:83/e-book/Adobe_Flex_2.0.1_Language_Reference_%5BFlex2.org%5D.chm">http://211.155.21.54:83/e-book/Adobe_Flex_2.0.1_Language_Reference_%5BFlex2.org%5D.chm</a></p><p>Adobe_Flex_2.0.1_Help （从flex2.org收集）<br /><a href="http://211.155.21.54:83/e-book/Adobe_Flex_2.0.1_Help_%5BFlex2.org%5D.chm">http://211.155.21.54:83/e-book/Adobe_Flex_2.0.1_Help_%5BFlex2.org%5D.chm</a></p><p>Adobe.Press.Adobe.Flex.2.Training.from.the.Source （从flex2.org收集）<br /><a href="http://211.155.21.54:83/e-book/Adobe.Press.Adobe.Flex.2.Training.from.the.Source.Oct.2006_%5BFlex2.org%5D.chm">http://211.155.21.54:83/e-book/Adobe.Press.Adobe.Flex.2.Training.from.the.Source.Oct.2006_%5BFlex2.org%5D.chm</a></p><p>apollo for flex pocketguide<br /><a href="http://211.155.21.54:83/e-book/apollo_for_flex_pocketguide_031907.pdf">http://211.155.21.54:83/e-book/apollo_for_flex_pocketguide_031907.pdf</a></p><p>APOLLO文档包<br /><a href="http://211.155.21.54:83/software/apollo_docs_alpha1_031907.zip">http://211.155.21.54:83/software/apollo_docs_alpha1_031907.zip</a> <br /></p></p>]]>
				</description>
				<guid isPermaLink="false">
					6285199@http://swingchen.bokee.com/
				</guid>
				<dc:subject></dc:subject>
				<dc:date>2007-05-20  22:45</dc:date>
			</item>
					<item>
				<title>
					<![CDATA[Flex编程小技巧集锦]]>
				</title>
				<link>http://swingchen.bokee.com/6242465.html</link>
				<description>
					<![CDATA[<p><p><strong>1. 让 FlexBuilder 在编译 mxml 时生成 AS 中间代码</strong>：<br />&nbsp;&nbsp;&nbsp; 在工程属性页的“Flex Compiler”处的编译参数增加： -keep-generated-actionscript</p><p><strong>2. AS3中对象深度拷贝通用方法(对于Transient不拷贝)<br /></strong>public static&nbsp;function cloneObject(source:Object) :* {<br />&nbsp; &nbsp; &nbsp; &nbsp; var typeName:String = getQualifiedClassName(source);//获取全名<br />&nbsp; &nbsp; &nbsp; &nbsp; var packageName:String = typeName.split(&quot;::&quot;)[1];//切出包名<br />&nbsp; &nbsp; &nbsp; &nbsp; var type:Class = Class(getDefinitionByName(typeName));//获取Class<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; registerClassAlias(packageName, type);//注册Class<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; //复制对象<br />&nbsp; &nbsp; &nbsp; &nbsp; var copier:ByteArray = new ByteArray();<br />&nbsp; &nbsp; &nbsp; &nbsp; copier.writeObject(source);<br />&nbsp; &nbsp; &nbsp; &nbsp; copier.position = 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; return copier.readObject();<br />}</p><p><strong>3. SharedObject对复杂对象的存取</strong><br />&nbsp;&nbsp; var&nbsp;user:User=new&nbsp;User();<br />&nbsp;&nbsp; user.id=1111<br />&nbsp;&nbsp; registerClassAlias(&quot;com.kadang.User&quot;,User);<br />&nbsp;&nbsp; share=SharedObject.getLocal(name,path);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; share.data.user=user;<br />读取的时候你可以直接:&nbsp;var&nbsp;ws:User=share.data.user.<br />关键就在于 registerClassAlias 函数<br />格式：registerClassAlias(&quot;别名&quot;,类名);<br />作用：将类以别名的形式进形AMF编码，以便在ShareObject,localConnection,ByteArray,等二进制数据传输交换中正确地还原成类.<br /></p></p>]]>
				</description>
				<guid isPermaLink="false">
					6242465@http://swingchen.bokee.com/
				</guid>
				<dc:subject></dc:subject>
				<dc:date>2007-04-25  11:49</dc:date>
			</item>
					<item>
				<title>
					<![CDATA[在Flex 2.0.1中使用动态CSS]]>
				</title>
				<link>http://swingchen.bokee.com/6237987.html</link>
				<description>
					<![CDATA[<p>Flex 2.0.1 的特性之一就是可以动态加载CSS文件。这就使得你的程序在只有一个SWF文件的情况下有多个不同的外观。换句话说，就是不需要多个SWF来对应多个CSS文件。<br /><br /><span style="COLOR: blue"><strong>示例</strong></span><br /><br />这里有一个简单的例子。创建一个Flex程序，其中有一个Panel控件，Panel中有一个Label和一个Button。然后创建两个CSS文件：<br /><br />red_styles.css:<br /><br /><div class="UBBPanel"><div class="UBBTitle"><img style="MARGIN: 0px 2px -3px 0px" alt="程序代码" src="http://www.zhuoqun.net/images/code.gif" /> 程序代码</div><div class="UBBContent">Panel {<br />&nbsp;&nbsp;&nbsp;&nbsp;background-color: #600000;<br />&nbsp;&nbsp;&nbsp;&nbsp;border-color: red;<br />&nbsp;&nbsp;&nbsp;&nbsp;color: white:<br />}</div></div><br /><br />green_styles.css:<br /><br /><div class="UBBPanel"><div class="UBBTitle"><img style="MARGIN: 0px 2px -3px 0px" alt="程序代码" src="http://www.zhuoqun.net/images/code.gif" /> 程序代码</div><div class="UBBContent">Panel {<br />&nbsp;&nbsp;&nbsp;&nbsp;background-color: #006000;<br />&nbsp;&nbsp;&nbsp;&nbsp;border-color: green;<br />&nbsp;&nbsp;&nbsp;&nbsp;color: white;<br />}</div></div><br /><br />在主程序中，加入以下代码：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; <div class="UBBPanel"><div class="UBBTitle"><img style="MARGIN: 0px 2px -3px 0px" alt="程序代码" src="http://www.zhuoqun.net/images/code.gif" /> 程序代码</div><div class="UBBContent">import mx.styles.StyleManager;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;private function loadStyles( name:String ) : void<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StyleManager.loadStyleDeclarations( name );<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div></div><br /><br />将下面两个RadioButton放到程序中Panel外的某个地方：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; <div class="UBBPanel"><div class="UBBTitle"><img style="MARGIN: 0px 2px -3px 0px" alt="程序代码" src="http://www.zhuoqun.net/images/code.gif" /> 程序代码</div><div class="UBBContent">&lt;mx:RadioButton label=&quot;Red&quot; click=&quot;loadStyles('red_styles.swf')&quot; /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;mx:RadioButton label=&quot;Green&quot; click=&quot;loadStyles('green_styles.swf')&quot; /&gt;</div></div><br /><br />注意“red” RadioButton想要使用red_styles.swf而“green” RadioButton想要使用green_styles.swf。你需要将CSS文件编译到SWF中。你可以使用下面两种方法的一种：<br /><br />如果你正在使用Flex Builder 2.0.1，右键点击CCS文件并选择“Compile CSS to SWF”选项。或者你也可以使用mxmlc来将CSS文件编译到SWF文件中。<br /><br />现在运行程序。当你点击“Red”按钮时Panel将会变成红色，点击“Green”按钮的时候Panel将会变成绿色。很酷，对吧？<br /><br /><span style="COLOR: blue"><strong>在程序中使用动态CSS</strong></span><br /><br />如果你想要在程序中使用动态CSS，例如在Application标签中添加 initialize=&quot;loadStyles('red_styles.css')&quot; ，你会发现在加载新的CSS来替换缺省CSS的时候会闪一下。<br /><br />你可以避免CCS替换时发生的闪烁，只需遵循以下步骤：<br /><br />首先，在Application标签中添加 visible=&quot;false&quot;。<br /><br />然后，覆写styleChanged 函数：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <div class="UBBPanel"><div class="UBBTitle"><img style="MARGIN: 0px 2px -3px 0px" alt="程序代码" src="http://www.zhuoqun.net/images/code.gif" /> 程序代码</div><div class="UBBContent">private var stylesAreGood:Boolean = false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;override public function styleChanged(styleProp:String):void<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.styleChanged(styleProp);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stylesAreGood = true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div></div><br /><br />更改loadStyles函数将stylesAreGood设成false：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <div class="UBBPanel"><div class="UBBTitle"><img style="MARGIN: 0px 2px -3px 0px" alt="程序代码" src="http://www.zhuoqun.net/images/code.gif" /> 程序代码</div><div class="UBBContent">private function loadStyles( name:String ) : void<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StyleManager.loadStyleDeclarations(name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stylesAreGood = false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div></div><br /><br />然后添加下面的函数：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <div class="UBBPanel"><div class="UBBTitle"><img style="MARGIN: 0px 2px -3px 0px" alt="程序代码" src="http://www.zhuoqun.net/images/code.gif" /> 程序代码</div><div class="UBBContent">private function showApp() : void<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( stylesAreGood ) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visible = true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div></div><br /><br />最后在Application标签中的updateComplete事件调用showApp函数：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <div class="UBBPanel"><div class="UBBTitle"><img style="MARGIN: 0px 2px -3px 0px" alt="程序代码" src="http://www.zhuoqun.net/images/code.gif" /> 程序代码</div><div class="UBBContent">updateComplete=&quot;showApp()&quot;</div></div><br /><br />以上步骤做的是下面这些事情：<br /><ul><li>开始的时候程序是不可见的。</li><br /><li>缺省的样式已经加载了，这会导致后面重复调用styleChanged函数。这里会将stylesAreGood设为true。<br /></li><li>然后初始化事件会调用loadStyles函数，将stylesAreGood设为false并请求加载样式表。<br /></li><li>一旦加载了新的样式，会再次调用styleChanged函数将stylesAreGood再次设置为true。<br /></li><li>最后，调用updateComplete函数，这时stylesAreGood的值为true，所以程序将会变为可见。</li></ul></p>]]>
				</description>
				<guid isPermaLink="false">
					6237987@http://swingchen.bokee.com/
				</guid>
				<dc:subject></dc:subject>
				<dc:date>2007-04-22  22:16</dc:date>
			</item>
					<item>
				<title>
					<![CDATA[使用RSL来减小Flex生成的SWF文件的大小]]>
				</title>
				<link>http://swingchen.bokee.com/6237984.html</link>
				<description>
					<![CDATA[<p><p>1----------------------<br />减小应用SWF文件大小的一个方法就是将一些共享的外部资源拆分出去, 成为一个独立的文件, 这样可以单独地加载缓存到客户端. 这些共享资源可以由多个应用在运行时进行加载, 但是传递到客户端的动作只会发生一次. 这些共享文件被称为运行时共享库(Runtime Shared Libraries)或者简写为RSL.<br /><br />如果你有多个应用而且这些应用共享一些核心组件或者类, 那么作为RSL,用户只会唯一的一次加载这些资源. 只要应用在同一个域中, 这些应用共享同一个缓存的RSL, 这样应用文件的大小就减小了. 使用RSL的应用越多, 效果越好, 如果只有一个应用, 总的文件大小不但不减小,反而会增大.<br /><br />你既可以使用Flex Builder通过项目选项来创建Flex的Library项目,也可以使用compc这样的命令行. 编译好RSL以后, 可以在编译应用时把Library的位置传递给编译器.<br /><br />下面是适合使用RSL的典型用例:<br />&nbsp; &nbsp; * 大型应用, 需要使用通用组件库加载多个小型应用. 最顶级的应用和下级应用可以共享存储在RSL中的组件.<br /><br />&nbsp; &nbsp; * 在一个服务器上的使用通用组件库的系列应用. 当用户操作第一个应用时, 用户下载应用的SWF文件和RSL. 当操作第二个应用时, 用户就只需要下载应用本身的SWF文件就行了.<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; * 一个独立的应用使用RSL的意义在于: 如果这个应用本身会频繁的修改, 而有一部分组件是极少改动的. 在这种情况下, 使用RSL的好处是: 组件下载一次, 而应用可以多次下载.<br /><br />2----------------------<br />理解链接可以帮助你理解RSL是怎样工作的. Flex编译器支持静态链接和动态链接. 静态链接是最通常的方法. 但是动态链接使你借助于RSL来实现SWF文件的缩水以及应用的下载次数.<br /><br />当你使用静态链接时, 编译器将应用中所有引用的类和依赖生成到最终的SWF文件中, 这个文件会比较大, 下载也会比较慢, 但是下载完毕后, 运行会比较快, 因为SWF文件中已经包含了所有的代码.<br /><br />如果你的应用中使用了类库, 那么你需要使用类路径或者是添加SWC文件. 如果是使用类路径, 编译器会将类路径中用到的那部分类打包生成到SWF文件中. 如果是使用SWC文件, 编译器会将整个SWC文件打包到SWF文件中.<br /><br />动态链接是这样的: 一个应用要使用的一部分类存在于一个外部的文件中, 运行时动态加载. 这样的话, 主SWF文件可以小一些, 但是应用依赖于运行时加载的外部文件. RSL就是使用动态链接的.<br /><br />如果想使用动态链接类, 需要把它们编译成库. 然后编译器将库中的内容从SWF文件剔除出去. 而且必须在编译时提供链接检查.<br /><br />为指定哪些文件是动态链接的,需要使用外部库路径选项,外部选项或者外部加载编译选项. 这些选项告诉编译器从应用中去除此部分内容, 而预备在运行时调用. 外部选项为动态链接指定了单独的类. 外部加载选项指定了一个XML文件, 描述了动态链接的类. <br /><br />指定SL的外部资源的顺序是非常关键的, 因为被其他类调用的基础类必须被首先加载.<br /><br />你还要用runtime-shared-libraries选项来指定RSL的位置.<br /><br />你可以使用link-report这个编译选项来查看应用的链接信息.<br /><br />3----------------------<br />RSL也需要谨慎使用 <br /><br />RSL也不是对于所有的应用都是有益的. 需要对应用RSL前后的下载时间和启动时间都测试过, 才能得到正确的结论.<br /><br />RSL不能跨域共享. 如果客户在一个域中使用了RSL, 然后运行了另一个域的应用, 虽然这两个RSL是相同的, 但是需要下载两次.<br /><br />RSL通常会增加应用的启动时间. 这是应用不管整个库实际如何使用, 只是简单地全部加载整个库. 就这一点来说, RSL越小越好. 这与静态链接库的使用是不同的. 当你编译一个Felx应用时, 编译器只解开需要的组件. 一般来说, 库的大小可以是任意的, 它只影响编译时间而不会影响下载的时间.<br /><br />如果在好几个应用中使用相同的组件库, 那么可以考虑合并这些库, 形成一个RSL. 但是如果库合并后, 每个应用只会用到其中的一小部分, 那么还不如多加载几个小RSL更高效.<br /><br />如果一些类重复打包在多个RSL中, 那么一定要注意同步更新的问题.<br /><br />RSL不能应用在基类是Sprite或者MovieClip的纯ActionScript项目中. 因为RSL需要基类知道如何加载RSL, 比如: Application或者SimpleApplication.<br /><br />关于 framework.swc文件 <br /><br />framework.swc是一个标准的SWC文件. 缺省地它不能用作RSL. 整个framwork.swc文件不被链接到任何一个应用中. Flex编译器只将那些应用用到的部分链接到生成最后的SWF文件. 比如: 如果一个应用只使用了Button, Panel和TextArea控件, 那么只有这几个控件和它们的依赖项被编译器链接.<br /><br />几乎所有的应用都需要framework.swc文件的一部分, 但是它并不适合作为RSL. 原因如上据说, RSL是整个链接, 不管实际使用多少的. 如果RSL包含了很多类, 而应用只使用了其中的一小部分, 那么这样的加载方式并不是最合理的. 这样使用会造成应用的启动时间大大增加.<br /><br /><br />RSL的优点<br /><br />下面的一个例子说明了将几个的共享组件做成RSL的优点. 在这个例子中, 组件库的大小是150K, 编译后的应用的大小是100K. <br /><br /><br />使用了RSL, RSL只被下载一次. 那么合计下载量是350K, 节约了30%. 如果再添加第3个, 第4个应用的话, 每次都能150K的下载量.<br /><br />一般来说, 在一个域中使用同一个RSL的应用越多, 那么好处就越大.<br /><br />4----------------------创建库<br /><br />可以使用Flex Builder或者Compc命令行来创建库. 库可以是一个SWC文件, 或者是包含了library.swf和catalog.xml文件的目录. 一个库通常包含自定义组件和类. 然后就可以在RSL中使用这些库了.<br /><br />在Flex Bulder中, 通过使用Flex Library Build Path对话框来添加资源到库中.<br /><br />在命令行中, 使用include-classes和include-namespaces选项来添加文件到库中.<br /><br />下面的命令行示例说明了如何创建一个名字叫CustomCellRenderer的库:<br /><br />compc -source-path ../mycomponents/components/local <br />-include-classes CustomCellRendererComponent -directory=true -debug=false<br />-output ../libraries/CustomCellRenderer<br /><br />所有包含的组件必须是静态链接的文件. 使用compc编译器创建库时, 不能使用include-file选项, 因为这个选项不是将library.swf文件静态链接到库中的.<br /><br />可以使用directory选项指定输出到一个目录而不是到一个SWC文件中:<br /><br /><!--l version="1.--><br /><flex-config /><br />&nbsp; &nbsp; <compiler /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<source-path /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<path-element />mycomponents/components/local</path-element /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;</source-path /><br />&nbsp; &nbsp; </compiler /><br />&nbsp; &nbsp; <output />libraries/CustomCellRenderer</output /><br />&nbsp; &nbsp; <directory />true</directory /><br />&nbsp; &nbsp; <debug />false</false /><br />&nbsp; &nbsp; <include-classes /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<class />CustomCellRendererComponent</class /><br />&nbsp; &nbsp; </include-classes /><br /></flex-config /><br /><br />输出会是一个目录,目录里包含两个文件<br />&nbsp; &nbsp; * catalog.xml<br />&nbsp; &nbsp; * library.swf<br /><br />创建library.swf文件后, 你可以编译应用并且指定文件的位置.<br />5----------------------<br />在编译应用时要使用RSL, 需要使用下列编译选项:<br /><br />&nbsp; &nbsp; * runtime-shared-libraries 提供运行运行时共享库的位置.<br />&nbsp; &nbsp; * external-library-path|externs|load-externs 提供编译时库的位置. 编译器需要这个信息动态链接.<br /><br /><br />使用runtime-shared-libraries选项来指定SWF文件的位置, 这样应用能够在运行时加载RSL. 需要指定SWF与部署位置的相对路径. 比如: 如果把library.swf文件放在web_root/libraries目录下, 而应用在web_root目录下, 那么文件的指定方法是: libraries/library.swf<br />可以用这个选项指定多个库. 如果指定了多个库, 需要用逗号分隔.<br /><br /><br />使用external-library-path选项来指定library在编译时的SWC文件或者目录的位置. 编译器会在编译时根据这个选项进行链接的检查. 你还可以使用externs或者load-externs选项来指定其他单独的classes或者xml文件来定义库的内容.<br /><br /><br />下面是一个编译MyApp应用的命令行示例, 其中使用了2个库:<br /><br />mxmlc -runtime-shared-libraries=<br />../libraries/CustomCellRenderer/library.swf,<br />../libraries/CustomDataGrid/library.swf <br />-external-library-path=../libraries/CustomCellRenderer, <br />../libraries/CustomDataGrid MyApp.mxml<br /><br />库的顺序非常重要, 因为基础类必须先加载.<br /><br /><br />你先可以使用配置文件, 示例如下:<br /><br /><compiler /><br />&nbsp; &nbsp; <external-library-path /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<path-element />../libraries/CustomCellRenderer</path-element /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<path-element />../libraries/CustomDataGrid</path-element /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<path-element />../libs/playerglobal.swc</path-element /><br />&nbsp; &nbsp; </external-library-path /><br /></compiler /><br /><runtime-shared-libraries /><br />&nbsp; &nbsp; <url />../libraries/CustomCellRenderer/library.swf</url /><br />&nbsp; &nbsp; <url />../libraries/CustomDataGrid/library.swf</url /><br /></runtime-shared-libraries /><br /><br /><br />runtime-shared-libraries选项值是library.swf文件是相对部署目录的路径. external-library-path选项是编译时SWC文件的路径. 因此, 必须先知道库的部署路径. <br /><br /><br /><br />示例中, 编译时文件结构如下:<br /><br />c:/appfiles/MyApp.mxml<br />c:/libraries/CustomCellRenderer/CustomCellRenderer.swc<br />c:/libraries/CustomDataGrid/CustomDataGrid.swc<br /><br />library.swf在编译进不是必需的. Flex编译器不验证SWF文件的存在与否, 但会把路径信息编译进行最后的应用代码中.<br /><br /><br />文件的部署结构如下:<br /><br />web_root/MyApp.swf<br />web_root/libraries/CustomCellRenderer/library.swf<br />web_root/libraries/CustomDataGrid/library.swf<br /><br />6----------------------<br />这个例子包括了应用中使用RSL的完整流程。使用命令行进行编译，但是你可以使用FlexBuilder用相同的过程来创建使用RSL。<br /><br />记住SWC文件是一个包含SWF文件的二进制文件，而SWF文件包含运行时的定义和附属元数据。你可以用压缩工具比如WinZip来打开SWC文件。<br />在使用RSL之前，首先需要了解如何静态链接一个SWC文件。<br /><br />在这个例子中，应用有一个app.mxml文件，使用ProductConfigurator.as和ProductView.as。文件目录如下：<br /><br />project/src/app.mxml<br />project/libsrc/ProductConfigurator.as<br />project/libsrc/ProductView.as <br />project/lib/<br />project/bin/<br /><br /><br />编译这个应用时，可以使用source-path选项将/libsrc目录下的类链接进来，方法如下：<br /><br />cd project/src<br />mxmlc -o=../bin/app.swf -source-path+=../libsrc app.mxml<br /><br />这个命令添加ProductConfigurator和ProductView类到SWF文件中。<br /><br /><br />如果要创建库，可以用compc来创建SWC文件，用下面的命令：<br /><br />cd project<br />compc -source-path+=libsrc -debug=false -o=lib/mylib.swc<br />ProductConfigurator ProductView<br /><br />注意要将debug选项设置为false. 生成结果是project/lib/mylib.swc文件，包含ProductConfigurator和ProductView两个类。<br /><br />现在可以使用新创建的库来重新编译应用，用library-path选项来指定库，方法如下：<br /><br />cd project/src <br />mxmlc -o=../bin/app.swf -library-path+=../lib/mylib.swc app.mxml<br /><br />创建库以后，你可以用RSL来重新编译生成应用。完整的步骤如下：<br /><br />&nbsp; &nbsp;1. 指示编译器不要将库链接到应用中。<br />&nbsp; &nbsp;2. 准备RSL，以便于在运行时使用。<br />&nbsp; &nbsp;3. 指示编译器生成附加元数据用于加载RSL。<br /><br /><br />第一步是指定编译生成应用时库中的哪些类需要排除在外。主要是使用external-library-path选项，如下面的例子所示：<br /><br />cd project/src<br />mxmlc -o=../bin/app.swf -external-library-path+=../lib/mylib.swc app.mxml<br /><br />如果你尝试运行app.swf，Flash Player会抛出一个运行时异常。因为ProductConfigurator和ProductView类还未定义。external-library-path配置选项告诉编译器编译这些库，但是忽略了定义。你也可以使用externs选项，但是一般来说，使用external-library-path更方便。<br /><br />下一步是准备RSL以便于能在运行时找到它。首先从SWC文件中将library.swf解压出来。<br /><br />下面是如何解压的例子：<br /><br />cd project/lib<br />unzip mylib.swc library.swf<br />mv library.swf ../bin/myrsl.swf<br /><br />此例子中将library.swf更名为myrsl.swf，并把它移动到应用SWF文件所在的目录。<br /><br />最后一步是使用RSL重新编译应用。主要是使用runtime-shared-libraries选项，方法如下：<br /><br />cd project/src <br />mxmlc -o=../bin/app.swf -external-library-path+=../lib/mylib.swc <br />-runtime-shared-libraries=myrsl.swf app.mxml<br /><br />现在新的SWF文件会在运行应用前动态加载RSL了。 </p><p>原文在 Adobe Flex 2 Help -&gt; Building and Deploying Flex 2 Applications -&gt;Building Flex Applications-&gt;Using Runtime Shared Libraries </p></p>]]>
				</description>
				<guid isPermaLink="false">
					6237984@http://swingchen.bokee.com/
				</guid>
				<dc:subject></dc:subject>
				<dc:date>2007-04-22  22:14</dc:date>
			</item>
					<item>
				<title>
					<![CDATA[Flex2动态加载的调试]]>
				</title>
				<link>http://swingchen.bokee.com/6237955.html</link>
				<description>
					<![CDATA[<p><p>&nbsp;&nbsp;&nbsp; 开发过程中主程序使用SWFLoader加载的其它项目无法调试，设置断点不起作用。解决无法调试的原因是SWFLoader直接加载Release版的swf文件，其中没有包含调试信息。因此，在调试时需要加载debug版的swf文件。当调试时，首先启动TmsClient-debug.swf，可以在TmsClient的主程序中用下面的代码判断当前是否处于调试模式</p><p>public&nbsp;function&nbsp;isDebug():Boolean&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;url:String&nbsp;=&nbsp;this.systemManager.loaderInfo.url;<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;protocol:String&nbsp;=&nbsp;URLUtil.getProtocol(url);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;protocol&nbsp;==&nbsp;&quot;file&quot;&nbsp;&amp;&amp;&nbsp;url.indexOf(&quot;%2Ddebug.swf&quot;)&nbsp;!=&nbsp;-1;<br />} </p></p>]]>
				</description>
				<guid isPermaLink="false">
					6237955@http://swingchen.bokee.com/
				</guid>
				<dc:subject></dc:subject>
				<dc:date>2007-04-22  22:02</dc:date>
			</item>
					<item>
				<title>
					<![CDATA[XML处理技术（2）]]>
				</title>
				<link>http://swingchen.bokee.com/6220963.html</link>
				<description>
					<![CDATA[<p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></span></p><h2 style="MARGIN: 15.6pt 0cm 15.6pt 1cm"><span lang="EN-US" style="mso-bidi-font-family: 黑体"><span style="mso-list: Ignore"><font face="黑体">1.3</font> <span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span></span><font face="黑体"><span lang="EN-US">XStream</span>的使用</font> </h2><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在使用</span> <span lang="EN-US">XStream</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">之前首先到</span> <span lang="EN-US">http://xstream.codehaus.org</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下载</span> <span lang="EN-US">XStream</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的最新版本，然后把</span> <span lang="EN-US">XSteam***.jar</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span> <span lang="EN-US">xpp3-***.jar</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">导入到</span> <span lang="EN-US">ClassPath</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下，然后就可以使用了，当然不加入</span> <span lang="EN-US">xpp3-***.jar</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也可以，我们可以使用</span> <span lang="EN-US">DomDriver</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">做为</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">解析驱动（只要在实例化</span> <span lang="EN-US">XStream</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的时候使用</span> <span lang="EN-US">new XStream(new DomDriver())</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">即可），不过</span> <span lang="EN-US">Xpp3</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为</span> <span lang="EN-US">XStream</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供的一个很有效率的</span> <span lang="EN-US">XML pull-parser</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现，推荐使用，可以提高解析的效率。</span> </p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的解析</span> </p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们有一个记录书籍进行的</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件：</span> </p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">&lt;book&gt;</font> </span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;name&gt;J2EE Guide Book&lt;/name&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;author&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;name&gt;Jerry&lt;/name&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;email&gt;Jerry@mail.com&lt;/email&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/author&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">&lt;/book&gt;</font> </span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为了解析此</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件，我们首先创建代表书籍和人员的两个</span> <span lang="EN-US">JavaBean</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span> </p><p class="MsoCaption" style="MARGIN: 4.5pt 0cm"><font size="2"><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">代码</span> <font face="Arial"><span lang="EN-US"><span style="mso-no-proof: yes">5</span> </span><span lang="EN-US">.</span> <span lang="EN-US"><span style="mso-no-proof: yes">3</span> </span><span lang="EN-US"></span></font><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">人员和书籍的</span> <span lang="EN-US"><font face="Arial">JavaBean</font> </span></font></p><div style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1.5pt solid; PADDING-LEFT: 0cm; PADDING-BOTTOM: 1pt; BORDER-LEFT: medium none; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1.5pt solid; mso-element: para-border-div"><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">public class BookInfo</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">{</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>private String name;</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>private PersonInfo author;</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>public PersonInfo getAuthor()</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>{</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return author;</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>public void setAuthor(PersonInfo author)</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>{</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.author = author;</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>public String getName()</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>{</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return name;</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>public void setName(String name)</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>{</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.name = name;</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">}</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><p><font face="宋体" size="2">&nbsp;</font> </p></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">public class PersonInfo</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">{</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>private String name;</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>private String email;</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>public String getEmail()</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>{</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return email;</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>public void setEmail(String email)</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>{</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.email = email;</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>public String getName()</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>{</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return name;</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>public void setName(String name)</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>{</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.name = name;</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">}</font> </span></p></div><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">然后我们就可以进行文件的解析了，这也是重头戏：</span> </p><p class="MsoCaption" style="MARGIN: 4.5pt 0cm"><font size="2"><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">代码</span> <font face="Arial"><span lang="EN-US"><span style="mso-no-proof: yes">5</span> </span><span lang="EN-US">.</span> <span lang="EN-US"><span style="mso-no-proof: yes">4</span> </span><span lang="EN-US">XStream</span> </font><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">的</span> <span lang="EN-US"><font face="Arial">XML</font> </span><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">解析</span> </font></p><div style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1.5pt solid; PADDING-LEFT: 0cm; PADDING-BOTTOM: 1pt; BORDER-LEFT: medium none; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1.5pt solid; mso-element: para-border-div"><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">XStream xstream = new XStream();</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">xstream.alias(&quot;book&quot;, BookInfo.class);</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">xstream.alias(&quot;author&quot;, PersonInfo.class);</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">InputStream inStream = XStreamDemo.class</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>.getResourceAsStream(&quot;/com/cownew/Char0503/Books.xml&quot;);</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">InputStreamReader reader = new InputStreamReader(inStream);</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">BookInfo book = (BookInfo) xstream.fromXML(reader);</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">StringBuffer sb = new StringBuffer();</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><font size="2"><span lang="EN-US"><font face="宋体">sb.append(book.getName()).append(&quot;</font> </span><span style="FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 宋体; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 宋体">的作者</span> <span lang="EN-US"><font face="宋体">&quot;);</font> </span></font></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><font size="2"><span lang="EN-US"><font face="宋体">sb.append(book.getAuthor().getName()).append(&quot;</font> </span><span style="FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 宋体; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 宋体">的</span> <span lang="EN-US"><font face="宋体">Email</font> </span><span style="FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 宋体; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 宋体">为</span> <span lang="EN-US"><font face="宋体">:&quot;);</font> </span></font></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">sb.append(book.getAuthor().getEmail());</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">System.out.println(sb);</font> </span></p></div><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行结果：</span> </p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">J2EE Guide Book</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的作者</span> <span lang="EN-US">Jerry</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span> <span lang="EN-US">Email</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为</span> <span lang="EN-US">:Jerry@mail.com<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">由于</span> <span lang="EN-US">book</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">节点和</span> <span lang="EN-US">author</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">节点对应的数据类型是我们的自定义类型，因此我们必须首先向</span> <span lang="EN-US">XStream</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注册这两个类型</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">：</span> <span lang="EN-US" style="mso-font-kerning: 0pt"><p /></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">xstream.alias(&quot;book&quot;, BookInfo.class);</font> </span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">xstream.alias(&quot;author&quot;, PersonInfo.class);</font> </span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">由于我们是使用</span> <span lang="EN-US">XStream</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">解析已有的</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件，因此我们必须让</span> <span lang="EN-US">XStream</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">知道标签对应的类型是什么，如果我们是使用</span> <span lang="EN-US">XStream</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件的生成，那么我们甚至无需向</span> <span lang="EN-US">XStream</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注册别名即可进行文件解析。</span> </p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注册完类型以后，调用</span> <span lang="EN-US">XStream</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类的</span> <span lang="EN-US">fromXML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法即可把</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">解析成</span> <span lang="EN-US">JavaBean</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象，无需额外的操作。</span> <span lang="EN-US" style="mso-font-kerning: 0pt"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件的保存</span> </p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们不仅需要解析</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件，有的时候还需要将数据保存到</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件，</span> <span lang="EN-US">XStream</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">同样能很好的完成，并且能更体现出</span> <span lang="EN-US">XStream</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的强大。</span> </p><p class="MsoCaption" style="MARGIN: 4.5pt 0cm"><font size="2"><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">代码</span> <font face="Arial"><span lang="EN-US"><span style="mso-no-proof: yes">5</span> </span><span lang="EN-US">.</span> <span lang="EN-US"><span style="mso-no-proof: yes">5</span> </span><span lang="EN-US">XStream</span> </font><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">中</span> <span lang="EN-US"><font face="Arial">XML</font> </span><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">的保存</span> </font></p><div style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1.5pt solid; PADDING-LEFT: 0cm; PADDING-BOTTOM: 1pt; BORDER-LEFT: medium none; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1.5pt solid; mso-element: para-border-div"><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">List bookList = new ArrayList();</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">PersonInfo p1 = new PersonInfo();</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">p1.setName(&quot;Tom&quot;);</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">p1.setEmail(&quot;Tom@mail.com&quot;);</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">PersonInfo p2 = new PersonInfo();</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">p2.setName(&quot;Jerry&quot;);</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">p2.setEmail(&quot;Jerry@mail.com&quot;);</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="宋体" size="2">&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">BookInfo book1 = new BookInfo();</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">book1.setName(&quot;About Face&quot;);</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">book1.setAuthor(p1);</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="宋体" size="2">&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">BookInfo book2 = new BookInfo();</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">book2.setName(&quot;UI Design&quot;);</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">book2.setAuthor(p2);</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="宋体" size="2">&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">bookList.add(book1);</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">bookList.add(book2);</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="宋体" size="2">&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">XStream xstream = new XStream();</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">String xml = xstream.toXML(bookList);</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">System.out.println(xml);</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="宋体" size="2">&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">List list = (List) xstream.fromXML(xml);</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">for(int i=0,n=list.size();i&lt;n;i++)</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">{</font> </span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>BookInfo book = (BookInfo) list.get(i);</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>StringBuffer sb = new StringBuffer();</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><font size="2"><span lang="EN-US"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>sb.append(book.getName()).append(&quot;</font> </span><span style="FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 宋体; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 宋体">的作者</span> <span lang="EN-US"><font face="宋体">&quot;);</font> </span></font></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><font size="2"><span lang="EN-US"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>sb.append(book.getAuthor().getName()).append(&quot;</font> </span><span style="FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 宋体; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 宋体">的</span> <span lang="EN-US"><font face="宋体">Email</font> </span><span style="FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 宋体; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 宋体">为</span> <span lang="EN-US"><font face="宋体">:&quot;);</font> </span></font></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>sb.append(book.getAuthor().getEmail());</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.println(sb);</font> </font></span></p><p class="a1" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">}</font> </span></p></div><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行结果：</span> </p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">&lt;list&gt;</font> </span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp; </span>&lt;com.cownew.Char0503.BookInfo&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>&lt;name&gt;About Face&lt;/name&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>&lt;author&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;name&gt;Tom&lt;/name&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;email&gt;Tom@mail.com&lt;/email&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>&lt;/author&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp; </span>&lt;/com.cownew.Char0503.BookInfo&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp; </span>&lt;com.cownew.Char0503.BookInfo&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>&lt;name&gt;UI Design&lt;/name&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>&lt;author&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;name&gt;Jerry&lt;/name&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;email&gt;Jerry@mail.com&lt;/email&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp;</span>&lt;/author&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp; </span>&lt;/com.cownew.Char0503.BookInfo&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">&lt;/list&gt;</font> </span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt" /><p class="a0" style="MARGIN: 0cm 0cm 0pt"><font size="2"><span lang="EN-US"></span></font></p><span lang="EN-US" style="mso-font-kerning: 0pt"><p>&nbsp;</p> </span><p /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不可思议吧！我们就是像在序列化一样把</span> <span lang="EN-US">JavaBean</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">“序列化”为</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">格式字符串，然后又轻松的将</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">格式字符串“反序列化”为</span> <span lang="EN-US">JavaBean</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span> </p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不过美中不足的就是“</span> <span lang="EN-US">&lt;com.cownew.Char0503.BookInfo&gt;</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”这个标签显得有点罗嗦。解决方式很简单，使用</span> <span lang="EN-US">5.3.1</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一节中提到的</span> <span lang="EN-US">alias</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法就可以办到：</span> </p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将</span> <span lang="EN-US">xstream.alias(&quot;book&quot;, BookInfo.class);</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">添加到</span> <span lang="EN-US">XStream xstream = new XStream();</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">之后，然后重新运行：</span> <span lang="EN-US" style="mso-font-kerning: 0pt"><p /></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">&lt;list&gt;</font> </span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp; </span>&lt;book&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>&lt;name&gt;About Face&lt;/name&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>&lt;author&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;name&gt;Tom&lt;/name&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;email&gt;Tom@mail.com&lt;/email&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>&lt;/author&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp; </span>&lt;/book&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp; </span>&lt;book&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>&lt;name&gt;UI Design&lt;/name&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>&lt;author&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;name&gt;Jerry&lt;/name&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;email&gt;Jerry@mail.com&lt;/email&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>&lt;/author&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="2"><font face="宋体"><span style="mso-spacerun: yes">&nbsp; </span>&lt;/book&gt;</font> </font></span></p><p class="a0" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="宋体" size="2">&lt;/list&gt;</font> </span></p></p>]]>
				</description>
				<guid isPermaLink="false">
					6220963@http://swingchen.bokee.com/
				</guid>
				<dc:subject></dc:subject>
				<dc:date>2007-04-13  11:05</dc:date>
			</item>
					<item>
				<title>
					<![CDATA[XML处理技术（1）]]>
				</title>
				<link>http://swingchen.bokee.com/6220957.html</link>
				<description>
					<![CDATA[<p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">技术是随着</span> <span lang="EN-US">Java</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的发展而发展起来的。在</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">出现之前对于简单的数据格式通常是存储在</span> <span lang="EN-US">ini</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">配置文件等文本文件中，复杂的格式则采用自定义的文件格式，因此对于每种文件格式都要有专门的解析程序。</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">出现以后解决了这个问题，程序面对的是有固定格式的</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件，只要通过标准</span> <span lang="EN-US">API</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就可以进行</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件的处理。</span> </p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件在案例系统中应用是很广泛的，比如</span> <span lang="EN-US">ClientConfig.xml</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span> <span lang="EN-US">ServerConfig.xml</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件就是使用</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件来做配置文件的，元数据文件以及元数据加载器更是离不开</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。因此本章将系统讲解一下</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件的处理技术。</span> </p><h2 style="MARGIN: 15.6pt 0cm 15.6pt 1cm"><span lang="EN-US" style="mso-bidi-font-family: 黑体"><span style="mso-list: Ignore"><font face="黑体">1.1</font> <span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span></span><font face="黑体"><span lang="EN-US">XML</span>处理技术比较</font> </h2><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span> <span lang="EN-US">Java</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">领域</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件的技术大致分为两类：</span> <span lang="EN-US">XML API</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span> <span lang="EN-US">OXMapping</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span> <span lang="EN-US">XML API</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">处理的基础，可选技术包括</span> <span lang="EN-US">JDOM</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span> <span lang="EN-US">Dom4j</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等；</span> <span lang="EN-US">OXMapping</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</span> <span lang="EN-US">Object-XML Mapping</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的简称，这种技术隐藏了</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">底层操作的细节，可以将</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件映射成一个</span> <span lang="EN-US">JavaBean</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象，也可以把一个</span> <span lang="EN-US">JavaBean</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象保存成一个</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件，可选技术</span> <span lang="EN-US">XStream</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span> <span lang="EN-US">Digester</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span> <span lang="EN-US">Castor</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等。</span> <span lang="EN-US">XML API</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span> <span lang="EN-US">OXMapping</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的关系类似于</span> <span lang="EN-US">JDBC</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span> <span lang="EN-US">ORMaping</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的关系，</span> <span lang="EN-US">OXMapping</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内部实现使用</span> <span lang="EN-US">XML API</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来完成，两种实现技术从不同的层面实现了</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的处理。</span> </p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">XML API</span> </p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">此类</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">处理技术中最流行的莫过于</span> <span lang="EN-US">JDOM</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span> <span lang="EN-US">Dom4j</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">了，二者的使用方式非常相似。不过</span> <span lang="EN-US">Dom4j</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的优势比</span> <span lang="EN-US">JDOM</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">更明显一些：</span> </p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">Dom4j</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">大量的使用接口，这使得</span> <span lang="EN-US">Dom4j</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">比</span> <span lang="EN-US">Dom4j</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">更加灵活和具有可扩展性；</span> </p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">Dom4j</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的性能表现比</span> <span lang="EN-US">JDOM</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">好；</span> </p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">Dom4j</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">支持</span> <span lang="EN-US">XPath</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等高级特性；</span> </p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">正是由于这些优点，很多开源项目都开始使用</span> <span lang="EN-US">Dom4j</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">做</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">解析技术，本书也将使用</span> <span lang="EN-US">Dom4j</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">做为</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">处理的首选。</span> </p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">OXMapping</span> </p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用</span> <span lang="EN-US">XML API</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">解析是略显烦琐的，受</span> <span lang="EN-US">ORMapping</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">技术的启发，人们发明了</span> <span lang="EN-US">OXMapping</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">技术，使用</span> <span lang="EN-US">OXMapping</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">技术，我们可以将</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件映射成一个</span> <span lang="EN-US">JavaBean</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象，也可以把一个</span> <span lang="EN-US">JavaBean</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象保存成一个</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件，这大大简化了我们的开发工作量，使得开发人员能更多的关注应用层面的东西。</span> </p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开源世界中涌现出很多</span> <span lang="EN-US">OXMapping</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">框架，包括</span> <span lang="EN-US">XStream</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span> <span lang="EN-US">Digester</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span> <span lang="EN-US">Castor</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等。</span> <span lang="EN-US">XStream</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span> <span lang="EN-US">Digester</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">把映射的过程在代码中完成，而</span> <span lang="EN-US">Castor</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则需要写一个和</span> <span lang="EN-US">Hibernate</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中</span> <span lang="EN-US">cfg.xml</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类似的映射配置文件。与</span> <span lang="EN-US">Digester</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">比起来，</span> <span lang="EN-US">XStream</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的主要优点就是更加小巧，使用也更加方便，不过目前使用</span> <span lang="EN-US">Digester</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是“开源名牌”</span> <span lang="EN-US">Apache</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下的子项目，网上可以参考的资料也比</span> <span lang="EN-US">XStream</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">多，好在</span> <span lang="EN-US">XStream</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">比较简洁，所以并不会对</span> <span lang="EN-US">XStream</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">造成太大影响。</span></p><h2 style="MARGIN: 15.6pt 0cm 15.6pt 1cm"><span lang="EN-US" style="mso-bidi-font-family: 黑体"><span style="mso-list: Ignore"><font face="黑体">1.2</font> <span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span></span><font face="黑体"><span lang="EN-US">Dom4j</span>的使用</font> </h2><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">Dom4j</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是一个易用的、开源的库，用于</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span> <span lang="EN-US">XPath</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span> <span lang="EN-US">XSLT</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。它应用于</span> <span lang="EN-US">Java</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">平台，采用了</span> <span lang="EN-US">Java</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">集合框架并完全支持</span> <span lang="EN-US">DOM</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span> <span lang="EN-US">SAX</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span> <span lang="EN-US">JAXP</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span> <span lang="EN-US">Dom4j</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</span> <span lang="EN-US">sourceforge.net</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上的一个开源项目，地址为</span> <span lang="EN-US">http://sourceforge.net/projects/dom4j</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span> </p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">Dom4j</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">里基于接口编程是一个非常显著的优点，下面是其主要的接口的继承体系结构图：</span> </p><p class="a" style="MARGIN: 8pt 0cm 6pt"><span lang="EN-US"><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter" /><formulas><f eqn="if lineDrawn pixelLineWidth 0" /><f eqn="sum @0 1 0" /><f eqn="sum 0 0 @1" /><f eqn="prod @2 1 2" /><f eqn="prod @3 21600 pixelWidth" /><f eqn="prod @3 21600 pixelHeight" /><f eqn="sum @0 0 1" /><f eqn="prod @6 1 2" /><f eqn="prod @7 21600 pixelWidth" /><f eqn="sum @8 21600 0" /><f eqn="prod @7 21600 pixelHeight" /><f eqn="sum @10 21600 0" /></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f" /><lock aspectratio="t" v:ext="edit" /></shapetype></span></p><p class="MsoCaption" style="MARGIN: 4.5pt 0cm"><font size="2"><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">图</span> <font face="Arial"><span lang="EN-US"><span style="mso-no-proof: yes">5</span> </span><span lang="EN-US">.</span> <span lang="EN-US"><span style="mso-no-proof: yes">1</span> </span></font></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这些接口大部分都是定义在包</span> <span lang="EN-US">org.dom4j</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，下面简单介绍各个接口的意义：</span> </p><p class="MsoCaption" style="MARGIN: 4.5pt 0cm"><font size="2"><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">表</span> <font face="Arial"><span lang="EN-US"><span style="mso-no-proof: yes">5</span> </span><span lang="EN-US">.</span> <span lang="EN-US"><span style="mso-no-proof: yes">1</span> </span><span lang="EN-US">Dom4j</span> </font><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">主要接口</span> </font></p><div align="center"><table class="MsoNormalTable" style="WIDTH: 407.25pt; mso-padding-alt: 0cm 0cm 0cm 0cm; mso-cellspacing: 0cm" cellspacing="0" cellpadding="0" width="543" border="1"><tbody><tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes"><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 127.5pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="170"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-font-kerning: 0pt">Node<p /></span> </p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 279.75pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="373"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-font-kerning: 0pt">Node</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">为是</span> <span lang="EN-US" style="mso-font-kerning: 0pt">dom4j</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">中所有的</span> <span lang="EN-US" style="mso-font-kerning: 0pt">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">节点的基类型接口</span> <span lang="EN-US" style="mso-font-kerning: 0pt"><p /></span></p></td></tr><tr style="mso-yfti-irow: 1"><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 127.5pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="170"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-font-kerning: 0pt">Attribute<p /></span> </p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 279.75pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="373"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-font-kerning: 0pt">Attribute</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">定义了</span> <span lang="EN-US" style="mso-font-kerning: 0pt">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">的属性</span> <span lang="EN-US" style="mso-font-kerning: 0pt"><p /></span></p></td></tr><tr style="mso-yfti-irow: 2"><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 127.5pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="170"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-font-kerning: 0pt">Branch<p /></span> </p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 279.75pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="373"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-font-kerning: 0pt">Branch</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">为能够包含子节点的节点如</span> <span lang="EN-US" style="mso-font-kerning: 0pt">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">元素</span> <span lang="EN-US" style="mso-font-kerning: 0pt">(Element)</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">和文档</span> <span lang="EN-US" style="mso-font-kerning: 0pt">(Docuemnts)</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">定义了一个公共的行为</span> <span lang="EN-US" style="mso-font-kerning: 0pt"><p /></span></p></td></tr><tr style="mso-yfti-irow: 3"><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 127.5pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="170"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-font-kerning: 0pt">Document<p /></span> </p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 279.75pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="373"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">定义了</span> <span lang="EN-US" style="mso-font-kerning: 0pt">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">文档</span> <span lang="EN-US" style="mso-font-kerning: 0pt"><p /></span></p></td></tr><tr style="mso-yfti-irow: 4"><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 127.5pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="170"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-font-kerning: 0pt">Element<p /></span> </p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 279.75pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="373"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-font-kerning: 0pt">Element</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">定义</span> <span lang="EN-US" style="mso-font-kerning: 0pt">XML </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">元素</span> <span lang="EN-US" style="mso-font-kerning: 0pt"><p /></span></p></td></tr><tr style="mso-yfti-irow: 5"><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 127.5pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="170"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-font-kerning: 0pt">DocumentType<p /></span> </p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 279.75pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="373"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-font-kerning: 0pt">DocumentType </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">定义</span> <span lang="EN-US" style="mso-font-kerning: 0pt">XML DOCTYPE</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">声明</span> <span lang="EN-US" style="mso-font-kerning: 0pt"><p /></span></p></td></tr><tr style="mso-yfti-irow: 6"><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 127.5pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="170"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-font-kerning: 0pt">Entity<p /></span> </p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 279.75pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="373"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-font-kerning: 0pt">Entity</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">定义</span> <span lang="EN-US" style="mso-font-kerning: 0pt">XML entity<p /></span> </p></td></tr><tr style="mso-yfti-irow: 7"><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 127.5pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="170"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-font-kerning: 0pt">CharacterData<p /></span> </p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 279.75pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="373"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-font-kerning: 0pt">CharacterData</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">是一个标识借口，标识基于字符的节点。如</span> <span lang="EN-US" style="mso-font-kerning: 0pt">CDATA</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">，</span> <span lang="EN-US" style="mso-font-kerning: 0pt">Comment, Text<p /></span> </p></td></tr><tr style="mso-yfti-irow: 8"><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 127.5pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="170"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-font-kerning: 0pt">CDATA<p /></span> </p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 279.75pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="373"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-font-kerning: 0pt">CDATA </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">定义了</span> <span lang="EN-US" style="mso-font-kerning: 0pt">XML CDATA </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">区域</span> <span lang="EN-US" style="mso-font-kerning: 0pt"><p /></span></p></td></tr><tr style="mso-yfti-irow: 9"><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 127.5pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="170"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-font-kerning: 0pt">Comment<p /></span> </p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 279.75pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="373"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-font-kerning: 0pt">Comment </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">定义了</span> <span lang="EN-US" style="mso-font-kerning: 0pt">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">注释的行为</span> <span lang="EN-US" style="mso-font-kerning: 0pt"><p /></span></p></td></tr><tr style="mso-yfti-irow: 10"><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 127.5pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="170"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-font-kerning: 0pt">Text<p /></span> </p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 279.75pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="373"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-font-kerning: 0pt">Text </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">定义</span> <span lang="EN-US" style="mso-font-kerning: 0pt">XML </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">文本节点</span> <span lang="EN-US" style="mso-font-kerning: 0pt"><p /></span></p></td></tr><tr style="mso-yfti-irow: 11; mso-yfti-lastrow: yes"><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 127.5pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="170"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-font-kerning: 0pt">ProcessingInstruction<p /></span> </p></td><td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 279.75pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" width="373"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-font-kerning: 0pt">ProcessingInstruction </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">定义</span> <span lang="EN-US" style="mso-font-kerning: 0pt">XML </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">处理指令</span> <span lang="EN-US" style="mso-font-kerning: 0pt"><p /></span></p></td></tr></tbody></table></div><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><p>&nbsp;</p> </span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">读取</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件</span> </p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应用中，最常用的莫过于</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件的解析读取了，</span> <span lang="EN-US">Dom4j</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供了多种读取</span> <span lang="EN-US">XML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文档的方式，包括</span> <span lang="EN-US">Dom</span> <span style="FONT-FAMILY: 宋体; mso-asci