﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-笔记-随笔分类-web service</title><link>http://www.blogjava.net/yuxh/category/48138.html</link><description>way</description><language>zh-cn</language><lastBuildDate>Tue, 08 May 2012 20:59:54 GMT</lastBuildDate><pubDate>Tue, 08 May 2012 20:59:54 GMT</pubDate><ttl>60</ttl><item><title>Developing.Web.Services.with.Apache.CXF.and.Axis2 3rd</title><link>http://www.blogjava.net/yuxh/archive/2011/10/24/361838.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Sun, 23 Oct 2011 16:26:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2011/10/24/361838.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/361838.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2011/10/24/361838.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/361838.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/361838.html</trackback:ping><description><![CDATA[<p>1. Code first approach:可能不能完全发挥框架和web services的能量，但能完成目标。减少了学习曲线，不用非常透彻了解web services概念，只要对某个框架有一定了解就能完成任务。<br />2.Contract first approach:根据服务先写WSDL文件，写好之后使用框架的工具把WSDL转换为依赖框架的代码。</p> <p>一&nbsp; 介绍</p> <p>当客户端调用你的web service的时候，他会发送一个消息过来（可能是soap 消息），如：</p> <p>&lt;foo:concatRequest&gt;<br />&lt;s1&gt;abc&lt;/s1&gt;<br />&lt;s2&gt;123&lt;/s2&gt;<br />&lt;/foo:concatRequest&gt;</p> <p>这时候如果有一个转换器把这个soap消息转换成java对象，然后调用你提供的java对象（方法）的话将会是非常方便的。几个最流行的库就是充当了这种转换器功能，比如CXF, Axis2 ， Metro （jdk6自带的有）。</p> <p>手动创建WSDL文件比较容易出错，可以使用eclipse进行可视化编辑。</p> <p>二 生成服务代码</p> <p>像CXF这样的 web service库可以创建转换器把进来的SOAP 消息转换为Java对象，然后作为参数传给方法。生成这些代码，只需创建一个main：</p> <p>1 CXF方式：</p> <div style="padding: 0px; margin: 0px; display: inline; float: none;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:4966c630-4349-47f9-89bf-99728ec1bfd0" class="wlWriterEditableSmartContent"><pre style=" width: 398px; height: 154px;background-color:White;overflow: auto;"><div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> main(String[] args) {
    WSDLToJava.main(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> String[] {
    </span><span style="color: #000000;">"</span><span style="color: #000000;">-server</span><span style="color: #000000;">"</span><span style="color: #000000;">,
    </span><span style="color: #000000;">"</span><span style="color: #000000;">-d</span><span style="color: #000000;">"</span><span style="color: #000000;">, </span><span style="color: #000000;">"</span><span style="color: #000000;">src/main/java</span><span style="color: #000000;">"</span><span style="color: #000000;">,
    </span><span style="color: #000000;">"</span><span style="color: #000000;">src/main/resources/SimpleService.wsdl</span><span style="color: #000000;">"</span><span style="color: #000000;"> });
    System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Done!</span><span style="color: #000000;">"</span><span style="color: #000000;">);
}</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>运行后会生成service endpoint interface（SEI），我们再写一个类（比如SimpleServiceImpl）来实现这个接口，写入自己的业务。还会生成传入消息对应的java对象。同时生成一个服务器类：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:80244efd-4088-45e0-8a18-b0800a7b61c8" class="wlWriterEditableSmartContent"><pre style=" width: 533px; height: 322px;background-color:White;overflow: auto;"><div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> SimpleService_P1_Server {
    </span><span style="color: #0000FF;">protected</span><span style="color: #000000;"> SimpleService_P1_Server() </span><span style="color: #0000FF;">throws</span><span style="color: #000000;"> Exception {
        System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Starting Server</span><span style="color: #000000;">"</span><span style="color: #000000;">);
        Object implementor </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> SimpleServiceImpl();
        String address </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">http://localhost:8080/ss/p1</span><span style="color: #000000;">"</span><span style="color: #000000;">;
        Endpoint.publish(address, implementor);
    }
    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> main(String args[]) </span><span style="color: #0000FF;">throws</span><span style="color: #000000;"> Exception {
        </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> SimpleService_P1_Server();
        System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Server ready...</span><span style="color: #000000;">"</span><span style="color: #000000;">);
        Thread.sleep(</span><span style="color: #000000;">5</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #000000;">60</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #000000;">1000</span><span style="color: #000000;">);
        System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Server exiting</span><span style="color: #000000;">"</span><span style="color: #000000;">);
        System.exit(</span><span style="color: #000000;">0</span><span style="color: #000000;">);
    }
}</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>运行这个类你的web service就可以服务了。</p>
<p>2 Axis2 方式</p><p>用类似的写main方法，或者配置eclipse的axis2插件可生成：在WSDL文件上，右键-&gt;web service-&gt;generate java bean skeleton</p><p>界面的上半部分针对服务端，可以根据需要调整生成的级别，下半部分是生成客户端。具体的级别可参考eclipse的帮助文档。一路下一步，最后根据命名空间生成包路径的文件，里面有XXSkeletonInterface.java 文件（如果生成的时候选择了生成接口的话），还有一个XXSkeleton实现了这个接口，也是我们需要修改这部分代码完成我们业务的地方。实际上有一个XXMessageReceiverInOut.java的类接收请求的消息，并调用XXSkeletonInterface。使用eclipse的axis2插件的时候，会自动在web-inf文件夹下生成service\xx(你的wsdl服务名)，这下面还要一个meta-inf文件夹装有wsd文件和一个services.xml配置文件。services.xml文件可配置包括XXMessageReceiverInOut类在内的选项。<br /></p>
<p>二 生成客户端代码</p>
<p>为了调用这些web service，同样可以用CXF这些库来生成在客户端运行的转换器（称为service stub）。当调用stub里的方法的时候，他会把你的数据/对象 转换为正确的XML格式，然后发送给真正的web service。当他收到响应的时候，又会把XML转回Java。</p>
<p>1 CXF 方式</p>
<p>和生成服务器端类似，使用方法</p>
<p>WSDLToJava.main(new String[] {<br />"-<font style="background-color: #ff0000">client</font>",<br />"-d", "src/main/java",<br />"src/main/resources/SimpleService.wsdl" });</p>
<p>运行后会生成客户端代码：</p>

<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:4198ae1e-74b5-4058-bc9d-a3dc9817ac00" class="wlWriterEditableSmartContent"><pre style=" width: 814px; height: 502px;background-color:White;overflow: auto;"><div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">final</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> SimpleService_P1_Client {
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">final</span><span style="color: #000000;"> QName SERVICE_NAME </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> QName(</span><span style="color: #000000;">"</span><span style="color: #000000;">http://ttdev.com/ss</span><span style="color: #000000;">"</span><span style="color: #000000;">,
        </span><span style="color: #000000;">"</span><span style="color: #000000;">SimpleService</span><span style="color: #000000;">"</span><span style="color: #000000;">);
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> SimpleService_P1_Client() {} 

    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> main(String args[]) </span><span style="color: #0000FF;">throws</span><span style="color: #000000;"> Exception {
        URL wsdlURL </span><span style="color: #000000;">=</span><span style="color: #000000;"> SimpleService_Service.WSDL_LOCATION;
        </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (args.length </span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">) {
            File wsdlFile </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> File(args[</span><span style="color: #000000;">0</span><span style="color: #000000;">]);
            </span><span style="color: #0000FF;">try</span><span style="color: #000000;"> {
                </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (wsdlFile.exists()) {
                wsdlURL </span><span style="color: #000000;">=</span><span style="color: #000000;"> wsdlFile.toURI().toURL();
            } </span><span style="color: #0000FF;">else</span><span style="color: #000000;"> {
                wsdlURL </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> URL(args[</span><span style="color: #000000;">0</span><span style="color: #000000;">]);
            }
            } </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (MalformedURLException e) {
                e.printStackTrace();
            }
        } 
        SimpleService_Service ss </span><span style="color: #000000;">=</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> SimpleService_Service(wsdlURL, SERVICE_NAME);
        SimpleService port </span><span style="color: #000000;">=</span><span style="color: #000000;"> ss.getP1();
        {
            System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Invoking concat...</span><span style="color: #000000;">"</span><span style="color: #000000;">);
            com.ttdev.ss.ConcatRequest _concat_parameters </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;">;
            java.lang.String _concat__return </span><span style="color: #000000;">=</span><span style="color: #000000;"> port.concat(_concat_parameters);
            System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">concat.result=</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> _concat__return);
        } 
        System.exit(</span><span style="color: #000000;">0</span><span style="color: #000000;">);
    }
}
</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>

<p>SimpleService_Service是创建的service stub，他模拟了客户端的服务。我们需要修改这个类中的_concat_parameters部分，加入参数：</p>
<p>com.ttdev.ss.ConcatRequest _concat_parameters = new ConcatRequest();<br />_concat_parameters.setS1("abc");<br />_concat_parameters.setS2("123");</p>
<p>现在就可以运行客户端代码了。SEI中有一些注解，可以修改，不细说。</p><p>&nbsp;</p><div>2 Axis2 方式</div>和生成服务端类似，利用eclipse插件直接生成，包路径类似，有一个XXStub类，这个类里面有包括请求和应答消息在内的内部类。使用的时候，先对请求消息参数类按业务需求赋值，最后调用Stub的请求方法。可以使用Stub的构造函数指定目标endpoint。<p>&nbsp;</p><img src ="http://www.blogjava.net/yuxh/aggbug/361838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2011-10-24 00:26 <a href="http://www.blogjava.net/yuxh/archive/2011/10/24/361838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RCP与Document风格</title><link>http://www.blogjava.net/yuxh/archive/2011/10/08/360224.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Sat, 08 Oct 2011 13:47:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2011/10/08/360224.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/360224.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2011/10/08/360224.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/360224.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/360224.html</trackback:ping><description><![CDATA[<p>有两种SOAP message风格，<em>document</em> 和<em>RPC，</em>他们定义了SOAP message body的格式。使用document风格时（包括wrapped和unwrapped），在wsdl中有一个非空的types部分，这个部分用XML Schema language定义了web service要用到的类型。<em>wsgen</em>工具从SIB（有SEI就足够了）中生成与XSD对应的java类。用java代码生成WSDL文件的时候需要一些java类，<em>wsgen</em>工具可以生成这些Java类，生成的这些java类被称为<em>wsgen</em> artifacts，底层的JWS类库会用到这些类，特别是JAX-B系列的包，会用来转换(marshal)java类实例(that is, Java in-memory objects)为XML类型的XML实例（满足XML Schema document的XML文档实例），</p> <p>The inverse operation is used to convert (unmarshal) an XML document instance to an in-memory<br>object, an object of a Java type or a comparable type in some other language。因此<em>wsgen</em>工具生成的artifacts，支持了Java为基础的web service的互操作性。JAX-B类库提供了Java和XSD类型转换的底层支持。</p> <p>For the most part, the wsgen utility can be used without our bothering to inspect the artifacts that it produces. For the most part, JAX-B remains unseen infrastructure.</p> <p><em>wsgen</em> artifacts实际上是wsdl message的数据类型，他们和XML Schema type绑定，每个message的XML Schema types从这些java类型得来的。注：在当前的jdk1.6.24中，已经融入wsgen自动生成的过程，不需手动调用。</p> <p><em>wsgen</em>工具可用来生成wsdl文件，如：% wsgen -cp "." -wsdl ch01.ts.TimeServerImpl 。这为TimeServer服务生成了wsdl。用wsgen生成的wsdl和通过访问发布的服务生成的wsdl 有个很大的区别：wsgen生成的没有endpoint,因为这个URL是在发布服务的时候决定的。其他地方两个wsdl是相同的。</p> <p><em>wsimport(</em>以前叫wsdl2java和 java2wsdl更形象<em>)</em>工具可使用WSDL生成用来帮助写客户端的artifacts .</p> <p>1 先契约再编码方式<br>一个例子：得到一个tempConvert.wsdl文件，使用命令 wsimport -keep -p ch02.tc tempConvert.wsdl ，命令根据wsdl的portType生成一个SEI类，把SEI的interface换为class，再把方法改为实现就可变为SIB。把该SIB发布，再使用命令wsimport -keep -p clientTC <a href="http://localhost:5599/tc?wsdl">http://localhost:5599/tc?wsdl</a>，来生成客户端辅助类<br>2 编码优先<br>服务被发布之后，会自动生成WSDL供客户端使用。然而，使用annotations可以控制WSDL或WSDL-generated artifacts的生成。</p><img src ="http://www.blogjava.net/yuxh/aggbug/360224.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2011-10-08 21:47 <a href="http://www.blogjava.net/yuxh/archive/2011/10/08/360224.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML介绍</title><link>http://www.blogjava.net/yuxh/archive/2011/03/24/346908.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Thu, 24 Mar 2011 01:05:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2011/03/24/346908.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/346908.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2011/03/24/346908.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/346908.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/346908.html</trackback:ping><description><![CDATA[<p>DTDs  <p>Introduced as part of the XML 1.0 specification, <a name="Id619e0_927896"></a>DTDs are the oldest constraint model around in the XML world. They're simply to use, but this simplicity comes at a price: DTDs are inflexible, and offer you little for data type validation as well.  <p>XML Schema (XSD)  <p><a name="Id622e0_927897"></a>XML Schema is the <a name="Id625e0_927898"></a>W3C's anointed successor to DTDs. XML Schemas are literally orders of magnitude more flexible than DTDs, and offer an almost dizzying array of support for various data types. However, just as DTDs were simple and limited, XML Schemas are flexible, complex, and (some would argue) bloated. It takes a lot of work to write a good schema, even for 50- or 100-line XML documents. For this reason, there's been a lot of dissatisfaction with XML Schema, even though they are widely being used.<pre><tt><i>[prefix]</i></tt>:<tt><i>[element name]</i></tt></pre><pre><tt><strong>元素：<br></strong></tt>root元素必须包含所有文档中的元素，只能有一个root元素。元素名只能以下划线或字母开头，不能有空格，区分大小写。开元素必须有对应闭元素（也有类似html的简写，如&lt;img src="http://www.blogjava.net/images/xml.gif" /&gt;）。文档由DTD或schema来限制它是否合格。</pre><pre><strong>属性：<br></strong>什么时候用属性？基本原则：多个值的数据用元素，单值的数据用元素。如果数据有很多值或者比较长，数据最可能属于元素。他主要被当作文本，容&lt;rss:author&gt;Doug Hally&lt;/rss:author&gt; &lt;journal:author&gt;Neil Gaiman&lt;/journal:author&gt;易搜索，好用。比如一本书的章节描述。然而如果数据主要作为单值处理的话，最好作为属性。如果搞不清楚，可以安全的使用元素。</pre><pre><strong>命名空间Namespaces：<br></strong>xml的命名空间是一种用一个特定的URI来关联XML文档里的一个或多个元素的方法。意味着元素是由名字和命名空间一起来识别的。许多复杂的XML文件里，同一个名字会有多个用途。比如，一个RSS feed有一个作者，这个作者同时是每个日记的。虽然这些数据都用author元素来表示，但他们不应该被当作同一个<em><font color="#c0504d">类型</font></em>的数据。命名空间很好的解决了这个问题，命名空间说明书要求一个前缀和唯一的URI联合起来区分不同命名空间里的元素。如<a href="http://www.neilgaiman.com/entries">http://www.neilgaiman.com/entries</a>作为URI，联合前缀<tt>journal用来表示日志相关的元素。<br></tt>&lt;rdf:RDF xmlns:rss="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:journal="http://www.neilgaiman.com/entries"&gt;，然后就可使用了：<br>&lt;rss:author&gt;Doug Hally&lt;/rss:author&gt; &lt;journal:author&gt;Neil Gaiman&lt;/journal:author&gt;实际上在使用命名空间前缀的时候再定义也可以的：<br>&lt;rss:author xmlns:rss="http://www.w3.org/1999/02/22-rdf-syntax-ns#"&gt;Doug Hally&lt;/rss:author&gt;<br>如果名字没有命名空间，不代表在默认命名空间中，而是xml处理器以在任何命名空间以外方式解释他。要声明默认命名空间的话就不用后面冒号部分，如&lt;Insured xmlns="<a href="http://www.IBM.com/software">http://www.IBM.com/software</a>"&gt; <br><strong>使用的一些术语</strong>:</pre>
<ul>
<li>
<p>The name of a namespace (such as <a href="http://www.ibm.com/software">http://www.ibm.com/software</a>) is the <i>namespace URI</i>.</p>
<li>
<p>The element or attribute name can include a prefix and a colon (as in prod:Quantity). A name in that form is called a <i>qualified name</i>, or<em> <font color="#d19049">QName</font></em>, and the identifier that follows the colon is called a<font color="#d19049"> <i>local name</i></font>. If a prefix is not in use, neither is the colon, and the QName and local name are identical.</p>
<li>
<p>An XML identifier (such as a local name) that has no colon is sometimes called an <font color="#d19049"><i>NCName</i>.</font> (The <i>NC</i> comes from the phrase <i>no colon</i>.)</p></li></ul>
<p><a name="Id328e0_958409"></a><strong>Entity references</strong>:<br>用来处理转义字符，语法是<font color="#c0504d"><tt>&amp;</tt> <tt><i>[entity name]</i></tt> <tt>;<font color="#000000">XML解析器碰到这种entity reference，就会用对应的值替换掉他。如<tt>&amp;lt;（&lt;）,<tt>&amp;gt;(&gt;),<tt><tt>&amp;amp;<tt><a name="Id337e0_958413"></a><a name="Id337e5_958413"></a>(&amp;),&amp;quot;("),<tt>&amp;apos;(')。注意entity reference是用户可定义的。比如多处用到版权提示，自己定义后以后更改就方便了：</tt></tt></tt></tt></tt></tt></font></tt></font>&lt;ora:copyright&gt;&amp;OReillyCopyright;&lt;/ora:copyright&gt;。除了用来表示数据中的复杂或特殊字符外，entity reference还会有更多用途。</p>
<p><strong>不解析的数据</strong>：<br>当传输大量数据给应用且不用xml解析的时候，CDATA就有用了。当大量的字符需要用entity reference转义的时候，或空格必须保留的时候，使用CDATA。&lt;![CDATA[….]]&gt;<font color="#c0504d"><br></p></font><img src ="http://www.blogjava.net/yuxh/aggbug/346908.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2011-03-24 09:05 <a href="http://www.blogjava.net/yuxh/archive/2011/03/24/346908.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>