﻿<?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-&lt;h3 style="font-family: Comic Sans MS"&gt;&lt;font color="#FA1A0A" size="10"&gt;︻┳═一Java&lt;/font&gt;&lt;/h3&gt;-随笔分类-XML</title><link>http://www.blogjava.net/rain1102/category/37666.html</link><description>&lt;br/&gt;&lt;font color="green" style="font-family: 华文行楷;font-size:16px;"&gt;子曰：危邦不入，乱邦不居。天下有道则见，无道则隐。&lt;/font&gt;&lt;font color="#3C1435"&gt;&lt;/font&gt;</description><language>zh-cn</language><lastBuildDate>Sun, 20 Sep 2009 13:43:43 GMT</lastBuildDate><pubDate>Sun, 20 Sep 2009 13:43:43 GMT</pubDate><ttl>60</ttl><item><title>Super CSV用于处理CSV文件的Java开源项目</title><link>http://www.blogjava.net/rain1102/archive/2009/09/20/295760.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Sun, 20 Sep 2009 09:48:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/09/20/295760.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/295760.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/09/20/295760.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/295760.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/295760.html</trackback:ping><description><![CDATA[<p>Super CSV是一个用于处理CSV文件的Java开源项目。它完全围绕面向对象的思想进行设计，因此可以利用你的面向对象代码来使得处理CSV文件变得更加简易。它支持输入/输出类型转换、数据完整性校验，支持从任何地方以任何编码读写数据，只要提供相应的Reader与Writer对象。可配置分割符，空格符号和行结束符等。 <br />
下面来看一下官方文档中的代码示例。<br />
1. 根据头来读取CSV文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;把文件中的每行记录读取出来转化为java对象，假设你有一个UserBean类，代码如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kwd"><span style="color: #008000"><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">UserBean</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="typ">String</span><span class="pln"> username</span><span class="pun">,</span><span class="pln"> password</span><span class="pun">,</span><span class="pln"> street</span><span class="pun">,</span><span class="pln"> town</span><span class="pun">;</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="kwd">int</span><span class="pln"> zip</span><span class="pun">;</span><span class="pln"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> getPassword</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> password</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> getStreet</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> street</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> getTown</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> town</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> getUsername</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> username</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> getZip</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> zip</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="kwd">&nbsp;&nbsp;&nbsp;&nbsp;public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setPassword</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> password</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">password </span><span class="pun">=</span><span class="pln"> password</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setStreet</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> street</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">street </span><span class="pun">=</span><span class="pln"> street</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="kwd">&nbsp;&nbsp;&nbsp;&nbsp;public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setTown</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> town</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">town </span><span class="pun">=</span><span class="pln"> town</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setUsername</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> username</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">username </span><span class="pun">=</span><span class="pln"> username</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="kwd">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setZip</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> zip</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">zip </span><span class="pun">=</span><span class="pln"> zip</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"><br />
</span><span class="pun">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span><br />
&nbsp;并且有一个CSV文件，包含一个文件头，假设文件内容如下：<br />
<span class="pln"><span style="color: #993366"><span class="pln">&nbsp;&nbsp;&nbsp;&nbsp;username</span><span class="pun">,</span><span class="pln"> password</span><span class="pun">,</span><span class="pln"> &nbsp; date</span><span class="pun">,</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp;zip</span><span class="pun">,</span><span class="pln"> &nbsp;town<br />
</span><span class="typ">&nbsp;&nbsp;&nbsp;&nbsp;Klaus</span><span class="pun">,</span><span class="pln"> &nbsp; &nbsp;qwexyKiks</span><span class="pun">,</span><span class="pln"> &nbsp;</span><span class="lit">17</span><span class="pun">/</span><span class="lit">1</span><span class="pun">/</span><span class="lit">2007</span><span class="pun">,</span><span class="pln"> &nbsp; </span><span class="lit">1111</span><span class="pun">,</span><span class="pln"> </span><span class="typ">New</span><span class="pln"> </span><span class="typ">York</span><span class="pln"><br />
</span><span class="typ">&nbsp;&nbsp;&nbsp;&nbsp;Oufu</span><span class="pun">,</span><span class="pln"> &nbsp; &nbsp; bobilop</span><span class="pun">,</span><span class="pln"> &nbsp; &nbsp;</span><span class="lit">10</span><span class="pun">/</span><span class="lit">10</span><span class="pun">/</span><span class="lit">2007</span><span class="pun">,</span><span class="pln"> &nbsp;</span><span class="lit">4555</span><span class="pun">,</span><span class="pln"> </span><span class="typ">New</span><span class="pln"> </span><span class="typ">York</span></span></span></p>
然后你可以使用一下代码来创建UserBean的实例对象，并打印出对象的属性值：<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="kwd"><span style="color: #008000"><span class="kwd">class</span><span class="pln"> </span><span class="typ">ReadingObjects</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
</span><span class="kwd">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> main</span><span class="pun">(</span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">throws</span><span class="pln"> </span><span class="typ">Exception</span><span class="pun">{</span><span class="pln"><br />
</span><span class="typ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ICsvBeanReader</span><span class="pln"> inFile </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">CsvBeanReader</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">FileReader</span><span class="pun">(</span><span class="str">"foo.csv"</span><span class="pun">),</span><span class="pln"> </span><span class="typ">CsvPreference</span><span class="pun">.</span><span class="pln">EXCEL_PREFERENCE</span><span class="pun">);</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
</span><span class="kwd">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final</span><span class="pln"> </span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> header </span><span class="pun">=</span><span class="pln"> inFile</span><span class="pun">.</span><span class="pln">getCSVHeader</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">);</span><span class="pln"><br />
</span><span class="typ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserBean</span><span class="pln"> user</span><span class="pun">;</span><span class="pln"><br />
</span><span class="kwd">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while</span><span class="pun">(</span><span class="pln"> </span><span class="pun">(</span><span class="pln">user </span><span class="pun">=</span><span class="pln"> inFile</span><span class="pun">.</span><span class="pln">read</span><span class="pun">(</span><span class="typ">UserBean</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">,</span><span class="pln"> header</span><span class="pun">,</span><span class="pln"> processors</span><span class="pun">))</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">user</span><span class="pun">.</span><span class="pln">getZip</span><span class="pun">());</span><span class="pln"><br />
</span><span class="pun">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="pln"><br />
</span><span class="pun">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="pln"> </span><span class="kwd">finally</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inFile</span><span class="pun">.</span><span class="pln">close</span><span class="pun">();</span><span class="pln"><br />
</span><span class="pun">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="pln"><br />
</span><span class="pun">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="pln"><br />
</span><span class="pun">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span></span></span>我们还剩下processors没有定义，通过名字我们可以看出是解析器，用来处理每列的数据，当然你也可以传入null，表示该列不做特殊处理，每个解析器可以被另外一个包含在内部，<tt>new Unique(new StrMinMax(5，20))，这个代码该列的值为唯一的，并且长度为8到20，具体处理细节我们先不讲，来看一下我们所需要的processors是如何定义的：<br />
<span class="kwd"><span style="color: #008000"><span class="kwd">&nbsp;&nbsp;&nbsp;&nbsp;final</span><span class="pln"> </span><span class="typ">CellProcessor</span><span class="pun">[]</span><span class="pln"> processors </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">CellProcessor</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Unique</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StrMinMax</span><span class="pun">(</span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">20</span><span class="pun">)),</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StrMinMax</span><span class="pun">(</span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">35</span><span class="pun">),</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ParseDate</span><span class="pun">(</span><span class="str">"dd/MM/yyyy"</span><span class="pun">),</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="kwd">&nbsp;&nbsp;&nbsp;&nbsp;new</span><span class="pln"> </span><span class="typ">Optional</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ParseInt</span><span class="pun">()),</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="kwd">&nbsp;&nbsp;&nbsp;&nbsp;null</span><span class="pln"><br />
</span><span class="pun">&nbsp;&nbsp;&nbsp;&nbsp;};</span></span></span><span class="pun"><br />
上面的代码的具体意思为：<br />
第一列是一个字符串，并且值是唯一的，长度为5到20<br />
第二列是一个字符串，长度是8到35<br />
第三列为一个日期类型，格式为天/月/年（day/month/year）<br />
第四列是一个整型数字，但只有这列有值的时候<span class="typ">ParseInt</span>处理器才会去处理这个值（其实就是该列可以为空）<br />
第五列为一个字符串（默认），不使用处理器<br />
<br />
如果你的CSV文件没有头，你也可以定义个数组来替代：<br />
<span class="kwd"><span style="color: #008000"><span class="kwd">final</span><span class="pln"> </span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> header </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="str">"username"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"password"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"date"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"zip"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"town"</span><span class="pun">};</span></span></span><br />
如果你想忽略某一列，和定义处理器类似，直接在头数组中使用null。<br />
<br />
全部代码如下：<br />
<span class="kwd"><span style="color: #008000"><span class="kwd">import</span><span class="pln"> <a title="Java爱好者" href="http://www.blogjava.net/rain1102">Java</a></span><span class="pun">.</span><span class="pln">io</span><span class="pun">.</span><span class="typ">FileReader</span><span class="pun">;</span><span class="pln"><br />
</span><span class="kwd">import</span><span class="pln"> <a title="Java爱好者" href="http://www.blogjava.net/rain1102">Java</a></span><span class="pun">.</span><span class="pln">io</span><span class="pun">.</span><span class="typ">IOException</span><span class="pun">;</span><span class="pln"><br />
</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">supercsv</span><span class="pun">.</span><span class="pln">cellprocessor</span><span class="pun">.</span><span class="typ">Optional</span><span class="pun">;</span><span class="pln"><br />
</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">supercsv</span><span class="pun">.</span><span class="pln">cellprocessor</span><span class="pun">.</span><span class="typ">ParseDate</span><span class="pun">;</span><span class="pln"><br />
</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">supercsv</span><span class="pun">.</span><span class="pln">cellprocessor</span><span class="pun">.</span><span class="typ">ParseInt</span><span class="pun">;</span><span class="pln"><br />
</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">supercsv</span><span class="pun">.</span><span class="pln">cellprocessor</span><span class="pun">.</span><span class="pln">constraint</span><span class="pun">.</span><span class="typ">StrMinMax</span><span class="pun">;</span><span class="pln"><br />
</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">supercsv</span><span class="pun">.</span><span class="pln">cellprocessor</span><span class="pun">.</span><span class="pln">constraint</span><span class="pun">.</span><span class="typ">Unique</span><span class="pun">;</span><span class="pln"><br />
</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">supercsv</span><span class="pun">.</span><span class="pln">cellprocessor</span><span class="pun">.</span><span class="pln">ift</span><span class="pun">.</span><span class="typ">CellProcessor</span><span class="pun">;</span><span class="pln"><br />
</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">supercsv</span><span class="pun">.</span><span class="pln">io</span><span class="pun">.</span><span class="typ">CsvBeanReader</span><span class="pun">;</span><span class="pln"><br />
</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">supercsv</span><span class="pun">.</span><span class="pln">io</span><span class="pun">.</span><span class="typ">ICsvBeanReader</span><span class="pun">;</span><span class="pln"><br />
</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">supercsv</span><span class="pun">.</span><span class="pln">prefs</span><span class="pun">.</span><span class="typ">CsvPreference</span><span class="pun">;</span><span class="pln"><br />
<br />
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ReadingObjects</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
<br />
&nbsp; &nbsp; </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">final</span><span class="pln"> </span><span class="typ">CellProcessor</span><span class="pun">[]</span><span class="pln"> userProcessors </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">CellProcessor</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Unique</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StrMinMax</span><span class="pun">(</span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">20</span><span class="pun">)),</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StrMinMax</span><span class="pun">(</span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">35</span><span class="pun">),</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ParseDate</span><span class="pun">(</span><span class="str">"dd/MM/yyyy"</span><span class="pun">),</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Optional</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ParseInt</span><span class="pun">()),</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="kwd">null</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp; </span><span class="pun">};</span><span class="pln"><br />
<br />
&nbsp;&nbsp;&nbsp; </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> main</span><span class="pun">(</span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">throws</span><span class="pln"> </span><span class="typ">Exception</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="typ">ICsvBeanReader</span><span class="pln"> inFile </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">CsvBeanReader</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">FileReader</span><span class="pun">(</span><span class="str">"foo.csv"</span><span class="pun">),</span><span class="pln"> </span><span class="typ">CsvPreference</span><span class="pun">.</span><span class="pln">EXCEL_PREFERENCE</span><span class="pun">);</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="kwd">final</span><span class="pln"> </span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> header </span><span class="pun">=</span><span class="pln"> inFile</span><span class="pun">.</span><span class="pln">getCSVHeader</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">);</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="typ">UserBean</span><span class="pln"> user</span><span class="pun">;</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="kwd">while</span><span class="pun">(</span><span class="pln"> </span><span class="pun">(</span><span class="pln">user </span><span class="pun">=</span><span class="pln"> inFile</span><span class="pun">.</span><span class="pln">read</span><span class="pun">(</span><span class="typ">UserBean</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">,</span><span class="pln"> header</span><span class="pun">,</span><span class="pln"> userProcessors</span><span class="pun">))</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">user</span><span class="pun">.</span><span class="pln">getZip</span><span class="pun">());</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="pun">}</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">finally</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inFile</span><span class="pun">.</span><span class="pln">close</span><span class="pun">();</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="pun">}</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;</span><span class="pun">}</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
<br />
<br />
<br />
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">UserBean</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp; </span><span class="typ">String</span><span class="pln"> username</span><span class="pun">,</span><span class="pln"> password</span><span class="pun">,</span><span class="pln"> town</span><span class="pun">;</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp; </span><span class="typ">Date</span><span class="pln"> date</span><span class="pun">;</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp; </span><span class="kwd">int</span><span class="pln"> zip</span><span class="pun">;</span><span class="pln"><br />
<br />
&nbsp;&nbsp;&nbsp; </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Date</span><span class="pln"> getDate</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="kwd">return</span><span class="pln"> date</span><span class="pun">;</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp; </span><span class="pun">}</span><span class="pln"><br />
<br />
&nbsp; &nbsp; </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> getPassword</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="kwd">return</span><span class="pln"> password</span><span class="pun">;</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp; </span><span class="pun">}</span><span class="pln"><br />
<br />
&nbsp; &nbsp; </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> getTown</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="kwd">return</span><span class="pln"> town</span><span class="pun">;</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp; </span><span class="pun">}</span><span class="pln"><br />
<br />
&nbsp; &nbsp; </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> getUsername</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="kwd">return</span><span class="pln"> username</span><span class="pun">;</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp; </span><span class="pun">}</span><span class="pln"><br />
<br />
&nbsp; &nbsp; </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> getZip</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="kwd">return</span><span class="pln"> zip</span><span class="pun">;</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp; </span><span class="pun">}</span><span class="pln"><br />
<br />
&nbsp; &nbsp; </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setDate</span><span class="pun">(</span><span class="kwd">final</span><span class="pln"> </span><span class="typ">Date</span><span class="pln"> date</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">date </span><span class="pun">=</span><span class="pln"> date</span><span class="pun">;</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp; </span><span class="pun">}</span><span class="pln"><br />
<br />
&nbsp; &nbsp; </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setPassword</span><span class="pun">(</span><span class="kwd">final</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> password</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">password </span><span class="pun">=</span><span class="pln"> password</span><span class="pun">;</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp; </span><span class="pun">}</span><span class="pln"><br />
<br />
&nbsp;&nbsp;&nbsp; </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setTown</span><span class="pun">(</span><span class="kwd">final</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> town</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">town </span><span class="pun">=</span><span class="pln"> town</span><span class="pun">;</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp; </span><span class="pun">}</span><span class="pln"><br />
<br />
&nbsp; &nbsp; </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setUsername</span><span class="pun">(</span><span class="kwd">final</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> username</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">username </span><span class="pun">=</span><span class="pln"> username</span><span class="pun">;</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp; </span><span class="pun">}</span><span class="pln"><br />
<br />
&nbsp; &nbsp; </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setZip</span><span class="pun">(</span><span class="kwd">final</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> zip</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">zip </span><span class="pun">=</span><span class="pln"> zip</span><span class="pun">;</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp; </span><span class="pun">}</span><span class="pln"><br />
<br />
</span><span class="pun">}</span></span></span><span class="pun"><br />
<br />
</span>如果你在读取文件之前根本不知道文件的具体格式，你可以选择<tt>CsvListReader.read()</tt>方法，把每行读出出来的数据放在一个List里面。<br />
<br />
读取文件的代码我们看到了，下面来看一下写的操作，也很简单。<br />
<span class="kwd"><span style="color: #008000"><span class="kwd">import</span><span class="pln"> <a title="Java爱好者" href="http://www.blogjava.net/rain1102">Java</a></span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">HashMap</span><span class="pun">;</span><span class="pln"><br />
</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">supercsv</span><span class="pun">.</span><span class="pln">io</span><span class="pun">.*;</span><span class="pln"><br />
</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">supercsv</span><span class="pun">.</span><span class="pln">prefs</span><span class="pun">.</span><span class="typ">CsvPreference</span><span class="pun">;</span><span class="pln"><br />
<br />
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">WritingMaps</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
&nbsp; main</span><span class="pun">(</span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">throws</span><span class="pln"> </span><span class="typ">Exception</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp; </span><span class="typ">ICsvMapWriter</span><span class="pln"> writer </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">CsvMapWriter</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">FileWriter</span><span class="pun">(...),</span><span class="pln"> </span><span class="typ">CsvPreference</span><span class="pun">.</span><span class="pln">EXCEL_PREFERENCE</span><span class="pun">);</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp; </span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="kwd">final</span><span class="pln"> </span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> header </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="str">"name"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"city"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"zip"</span><span class="pln"> </span><span class="pun">};</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="com">// set up some data to write</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="kwd">final</span><span class="pln"> </span><span class="typ">HashMap</span><span class="pun">&lt;</span><span class="typ">String</span><span class="pun">,</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span class="kwd">super</span><span class="pln"> </span><span class="typ">Object</span><span class="pun">&gt;</span><span class="pln"> data1 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">HashMap</span><span class="pun">&lt;</span><span class="typ">String</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Object</span><span class="pun">&gt;();</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data1</span><span class="pun">.</span><span class="pln">put</span><span class="pun">(</span><span class="pln">header</span><span class="pun">[</span><span class="lit">0</span><span class="pun">],</span><span class="pln"> </span><span class="str">"Karl"</span><span class="pun">);</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data1</span><span class="pun">.</span><span class="pln">put</span><span class="pun">(</span><span class="pln">header</span><span class="pun">[</span><span class="lit">1</span><span class="pun">],</span><span class="pln"> </span><span class="str">"Tent city"</span><span class="pun">);</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data1</span><span class="pun">.</span><span class="pln">put</span><span class="pun">(</span><span class="pln">header</span><span class="pun">[</span><span class="lit">2</span><span class="pun">],</span><span class="pln"> </span><span class="lit">5565</span><span class="pun">);</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="kwd">final</span><span class="pln"> </span><span class="typ">HashMap</span><span class="pun">&lt;</span><span class="typ">String</span><span class="pun">,</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span class="kwd">super</span><span class="pln"> </span><span class="typ">Object</span><span class="pun">&gt;</span><span class="pln"> data2 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">HashMap</span><span class="pun">&lt;</span><span class="typ">String</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Object</span><span class="pun">&gt;();</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data2</span><span class="pun">.</span><span class="pln">put</span><span class="pun">(</span><span class="pln">header</span><span class="pun">[</span><span class="lit">0</span><span class="pun">],</span><span class="pln"> </span><span class="str">"Banjo"</span><span class="pun">);</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data2</span><span class="pun">.</span><span class="pln">put</span><span class="pun">(</span><span class="pln">header</span><span class="pun">[</span><span class="lit">1</span><span class="pun">],</span><span class="pln"> </span><span class="str">"River side"</span><span class="pun">);</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data2</span><span class="pun">.</span><span class="pln">put</span><span class="pun">(</span><span class="pln">header</span><span class="pun">[</span><span class="lit">2</span><span class="pun">],</span><span class="pln"> </span><span class="lit">5551</span><span class="pun">);</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="com">// the actual writing</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer</span><span class="pun">.</span><span class="pln">writeHeader</span><span class="pun">(</span><span class="pln">header</span><span class="pun">);</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="pln">data1</span><span class="pun">,</span><span class="pln"> header</span><span class="pun">);</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="pln">data2</span><span class="pun">,</span><span class="pln"> header</span><span class="pun">);</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp; </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">finally</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer</span><span class="pun">.</span><span class="pln">close</span><span class="pun">();</span><span class="pln"><br />
&nbsp;&nbsp;&nbsp; </span><span class="pun">}</span><span class="pln"><br />
&nbsp; </span><span class="pun">}</span><span class="pln"><br />
</span><span class="pun">}</span></span></span><br />
</span></tt><img src ="http://www.blogjava.net/rain1102/aggbug/295760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2009-09-20 17:48 <a href="http://www.blogjava.net/rain1102/archive/2009/09/20/295760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用dom4j解析XML时候忽略DTD文件</title><link>http://www.blogjava.net/rain1102/archive/2009/08/06/290063.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 06 Aug 2009 03:17:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/08/06/290063.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/290063.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/08/06/290063.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/290063.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/290063.html</trackback:ping><description><![CDATA[<p>要这么做是因为Server返回给我们的XML肯定是合法的，不需要验证。</p>
<p>而设置不需要验证，只需要设置DocumentBuilderFactory.setValidating（false）就可以达到效果了，但是解析器还是会读取DTD的，解决的方法是实现EntityResolver接口，具体代码如下：</p>
<p>package com.founder.demo;</p>
<p>import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.io.ByteArrayInputStream;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.io.IOException;</p>
<p>import org.xml.sax.EntityResolver;<br />
import org.xml.sax.InputSource;<br />
import org.xml.sax.SAXException;</p>
<p>public class IgnoreDTDEntityResolver implements EntityResolver {</p>
<p>&nbsp;@Override<br />
&nbsp;public InputSource resolveEntity(String publicId, String systemId)<br />
&nbsp;&nbsp;&nbsp;throws SAXException, IOException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new InputSource(new ByteArrayInputStream("&lt;?xml version='1.0' encoding='UTF-8'?&gt;".getBytes()));<br />
&nbsp;}</p>
<p>}<br />
<br />
然后设置SAXReader 对象如下：<br />
SAXReader reader = new SAXReader();<br />
reader.setEntityResolver(new IgnoreDTDEntityResolver()); // ignore dtd<br />
<br />
一切ok。</p><img src ="http://www.blogjava.net/rain1102/aggbug/290063.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2009-08-06 11:17 <a href="http://www.blogjava.net/rain1102/archive/2009/08/06/290063.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据转换引擎：Smooks [转载]</title><link>http://www.blogjava.net/rain1102/archive/2009/08/04/289847.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 04 Aug 2009 12:00:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/08/04/289847.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/289847.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/08/04/289847.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/289847.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/289847.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 概览Smooks是一个开源的Java框架，用于处理&#8220;数据事件流&#8221;。它常常被认为是一个转换框架并以此被用于好几个产品和项目中，包括JBoss ESB（以及其它ESB）。然而究其核心，Smooks未提及&#8220;转换&#8221;或者其它相关的词汇。它的应用远不只这一点！Smooks的工作是将结构化/层次化的数据流转变成&#8220;事件&#8221;流，然后交与&...&nbsp;&nbsp;<a href='http://www.blogjava.net/rain1102/archive/2009/08/04/289847.html'>阅读全文</a><img src ="http://www.blogjava.net/rain1102/aggbug/289847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2009-08-04 20:00 <a href="http://www.blogjava.net/rain1102/archive/2009/08/04/289847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>四种操作xml的方式： SAX, DOM, JDOM , DOM4J的比较[转载]</title><link>http://www.blogjava.net/rain1102/archive/2009/06/20/283349.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Sat, 20 Jun 2009 06:09:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/20/283349.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/283349.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/20/283349.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/283349.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/283349.html</trackback:ping><description><![CDATA[原文地址:http://blog.chinaunix.net/u/25176/showart_379827.html<br />
<div>
<p>1. 介绍</p>
<p>1）DOM(JAXP&nbsp;Crimson解析器) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构，然后才能做任何工作。由于它是基于信息层次的，因而DOM被认为是基于树或基于对象的。DOM以及广义的基于树的处理具有几个优点。首先，由于树在内存中是持久的，因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航，而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。</p>
<p>2）SAX</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAX处理的优点非常类似于流媒体的优点。分析能够立即开始，而不是等待所有的数据被处理。而且，由于应用程序只是在读取数据时检查数据，因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上，应用程序甚至不必解析整个文档；它可以在某个条件得到满足时停止解析。一般来说，SAX还比它的替代者DOM快许多。 <br />
&nbsp;　　选择DOM还是选择SAX？ 对于需要自己编写代码来处理XML文档的开发人员来说，&nbsp; 选择DOM还是SAX解析模型是一个非常重要的设计决策。 DOM采用建立树形结构的方式访问XML文档，而SAX采用的事件模型。 <br />
<br />
　　DOM解析器把XML文档转化为一个包含其内容的树，并可以对树进行遍历。用DOM解析模型的优点是编程容易，开发人员只需要调用建树的指令，然后利用navigation&nbsp;APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用DOM解析器的时候需要处理整个XML文档，所以对性能和内存的要求比较高，尤其是遇到很大的XML文件的时候。由于它的遍历能力，DOM解析器常用于XML文档需要频繁的改变的服务中。 <br />
<br />
　　SAX解析器采用了基于事件的模型，它在解析XML文档的时候可以触发一系列的事件，当发现给定的tag的时候，它可以激活一个回调方法，告诉该方法制定的标签已经找到。SAX对内存的要求通常会比较低，因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时，SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难，而且很难同时访问同一个文档中的多处不同数据。 </p>
<p>3）JDOM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<a href="http://www.jdom.org/"><font color="#0000ff">http://www.jdom.org/</font></a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JDOM的目的是成为Java特定文档模型，它简化与XML的交互并且比使用DOM实现更快。由于是第一个Java特定模型，JDOM一直得到大力推广和促进。正在考虑通过&#8220;Java规范请求JSR-102&#8221;将它最终用作&#8220;Java标准扩展&#8221;。从2000年初就已经开始了JDOM开发。 </p>
<p>　　JDOM与DOM主要有两方面不同。首先，JDOM仅使用具体类而不使用接口。这在某些方面简化了API，但是也限制了灵活性。第二，API大量使用了Collections类，简化了那些已经熟悉这些类的Java开发者的使用。 </p>
<p>　　JDOM文档声明其目的是&#8220;使用20%(或更少)的精力解决80%(或更多)Java/XML问题&#8221;(根据学习曲线假定为20%)。JDOM对于大多数Java/XML应用程序来说当然是有用的，并且大多数开发者发现API比DOM容易理解得多。JDOM还包括对程序行为的相当广泛检查以防止用户做任何在XML中无意义的事。然而，它仍需要您充分理解XML以便做一些超出基本的工作(或者甚至理解某些情况下的错误)。这也许是比学习DOM或JDOM接口都更有意义的工作。 </p>
<p>　　JDOM自身不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档(尽管它还可以将以前构造的DOM表示作为输入)。它包含一些转换器以将JDOM表示输出成SAX2事件流、DOM模型或XML文本文档。JDOM是在Apache许可证变体下发布的开放源码。</p>
<p>4）DOM4J&nbsp;http://dom4j.sourceforge.net/&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 虽然DOM4J代表了完全独立的开发结果，但最初，它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能，包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项，它通过DOM4J API和标准DOM接口具有并行访问功能。从2000下半年开始，它就一直处于开发之中。 </p>
<p>　　为支持所有这些功能，DOM4J使用接口和抽象基本类方法。DOM4J大量使用了API中的Collections类，但是在许多情况下，它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是，虽然DOM4J付出了更复杂的API的代价，但是它提供了比JDOM大得多的灵活性。 </p>
<p>　　在添加灵活性、XPath集成和对大文档处理的目标时，DOM4J的目标与JDOM是一样的：针对Java开发者的易用性和直观操作。它还致力于成为比JDOM更完整的解决方案，实现在本质上处理所有Java/XML问题的目标。在完成该目标时，它比JDOM更少强调防止不正确的应用程序行为。 </p>
<p>　　DOM4J是一个非常非常优秀的Java XML API，具有性能优异、功能强大和极端易用使用的特点，同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML，特别值得一提的是连Sun的JAXM也在用DOM4J。 <br />
</p>
<p>2.. 比较</p>
<p>1）DOM4J性能最好，连Sun的JAXM也在用DOM4J。目前许多开源项目中大量采用DOM4J，例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性，那就采用DOM4J.</p>
<p>2）JDOM和DOM在性能测试时表现不佳，在测试10M文档时内存溢出。在小文档情况下还值得考虑使用DOM和JDOM。虽然JDOM的开发者已经说明他们期望在正式发行版前专注性能问题，但是从性能观点来看，它确实没有值得推荐之处。另外，DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语言。它还是许多其它与XML相关的标准的基础，因为它正式获得W3C推荐(与基于非标准的Java模型相对)，所以在某些类型的项目中可能也需要它(如在JavaScript中使用DOM)。</p>
<p>3）SAX表现较好，这要依赖于它特定的解析方式－事件驱动。一个SAX检测即将到来的XML流，但并没有载入到内存(当然当XML流被读入时，会有部分文档暂时隐藏在内存中)。</p>
<p>3. 四种xml操作方式的基本使用方法</p>
<p>xml文件：</p>
<p>&lt;?xml version="1.0" encoding="utf-8" ?&gt; <br />
&lt;Result&gt;<br />
&nbsp;&nbsp; &lt;VALUE&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;NO DATE="2005"&gt;A1&lt;/NO&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ADDR&gt;GZ&lt;/ADDR&gt;<br />
&nbsp;&nbsp; &lt;/VALUE&gt;<br />
&nbsp;&nbsp; &lt;VALUE&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;NO DATE="2004"&gt;A2&lt;/NO&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ADDR&gt;XG&lt;/ADDR&gt;<br />
&nbsp; &lt;/VALUE&gt;<br />
&lt;/Result&gt;</p>
<p>1）DOM</p>
<p>import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.io.*;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.util.*;<br />
import org.w3c.dom.*;<br />
import javax.xml.parsers.*; </p>
<p>public class MyXMLReader{ <br />
　public static void main(String arge[]){ </p>
<p>　　long lasting =System.currentTimeMillis(); <br />
　　try{&nbsp; <br />
　　　File f=new File("data_10k.xml"); <br />
　　　DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); <br />
　　　DocumentBuilder builder=factory.newDocumentBuilder(); <br />
　　　Document doc = builder.parse(f); <br />
　　　NodeList nl = doc.getElementsByTagName("VALUE"); <br />
　　　for (int i=0;i＜nl.getLength();i++){ <br />
　　　　System.out.print("车牌号码:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue()); <br />
　　　　System.out.println("车主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue()); <br />
　 　} <br />
　　}catch(Exception e){ <br />
　　　e.printStackTrace(); <br />
} </p>
<p>2）SAX</p>
<p>import org.xml.sax.*;<br />
import org.xml.sax.helpers.*;<br />
import javax.xml.parsers.*; </p>
<p>public class MyXMLReader extends DefaultHandler { </p>
<p>　<a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.util.Stack tags = new <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.util.Stack(); <br />
　public MyXMLReader() { <br />
　　super();<br />
&nbsp;&nbsp; } </p>
<p>　public static void main(String args[]) { <br />
　　long lasting = System.currentTimeMillis(); <br />
　　try { <br />
　　　SAXParserFactory sf = SAXParserFactory.newInstance(); <br />
　　　SAXParser sp = sf.newSAXParser(); <br />
　　　MyXMLReader reader = new MyXMLReader(); <br />
　　　sp.parse(new InputSource("data_10k.xml"), reader); <br />
　　} catch (Exception e) { <br />
　　　e.printStackTrace(); <br />
　　} </p>
<p>　　System.out.println("运行时间：" + (System.currentTimeMillis() - lasting) + "毫秒");} <br />
　　public void characters(char ch[], int start, int length) throws SAXException { <br />
　　String tag = (String) tags.peek(); <br />
　　if (tag.equals("NO")) {&nbsp; <br />
　　　System.out.print("车牌号码：" + new String(ch, start, length));<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; if (tag.equals("ADDR")) { <br />
　　System.out.println("地址:" + new String(ch, start, length));<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; } </p>
<p>　　public void startElement(String uri,String localName,String qName,Attributes attrs) { <br />
　　tags.push(qName);}<br />
}&nbsp; </p>
<p>3） JDOM</p>
<p>import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.io.*;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.util.*;<br />
import org.jdom.*;<br />
import org.jdom.input.*; </p>
<p>public class MyXMLReader { </p>
<p>　public static void main(String arge[]) { <br />
　　long lasting = System.currentTimeMillis(); <br />
　　try { <br />
　　　SAXBuilder builder = new SAXBuilder();&nbsp; <br />
　　　Document doc = builder.build(new File("data_10k.xml"));&nbsp; <br />
　　　Element foo = doc.getRootElement();&nbsp; <br />
　　　List allChildren = foo.getChildren();&nbsp; <br />
　　　for(int i=0;i＜allChildren.size();i++) {&nbsp; <br />
　　　　System.out.print("车牌号码:" + ((Element)allChildren.get(i)).getChild("NO").getText()); <br />
　　　　System.out.println("车主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText()); <br />
　　　} <br />
　　} catch (Exception e) { <br />
　　　e.printStackTrace(); <br />
} </p>
<p>}</p>
<p>4）DOM4J</p>
<p>import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.io.*;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.util.*;<br />
import org.dom4j.*;<br />
import org.dom4j.io.*; </p>
<p>public class MyXMLReader { </p>
<p>　public static void main(String arge[]) { <br />
　　long lasting = System.currentTimeMillis(); <br />
　　try { <br />
　　　File f = new File("data_10k.xml"); <br />
　　　SAXReader reader = new SAXReader(); <br />
　　　Document doc = reader.read(f); <br />
　　　Element root = doc.getRootElement(); <br />
　　　Element foo; <br />
　　　for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) { <br />
　　　　foo = (Element) i.next(); <br />
　　　　System.out.print("车牌号码:" + foo.elementText("NO")); <br />
　　　　System.out.println("车主地址:" + foo.elementText("ADDR")); <br />
　　　} <br />
　　} catch (Exception e) { <br />
　　　e.printStackTrace(); <br />
&nbsp;&nbsp;&nbsp; } <br />
}</p>
</div><img src ="http://www.blogjava.net/rain1102/aggbug/283349.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2009-06-20 14:09 <a href="http://www.blogjava.net/rain1102/archive/2009/06/20/283349.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML和JSON响应</title><link>http://www.blogjava.net/rain1102/archive/2008/06/05/206078.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 05 Jun 2008 08:21:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/06/05/206078.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/206078.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/06/05/206078.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/206078.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/206078.html</trackback:ping><description><![CDATA[<h4>使用render方法输出XML</h4>
<p class="paragraph">Grails支持一些不同的方法来产生XML和JSON响应。第一个是隐式的通过render方法。
<p class="paragraph"><code>render</code>方法可以传递一个代码块来执行标记生成器产生XML </p>
<div class="code">
<pre>def list = {
def results = Book.list()
render(contentType:<span class="java-quote">"text/xml"</span>) {
books {
<span class="java-keyword">for</span>(b in results) {
book(title:b.title)
}
}
}
}</pre>
</div>
<p class="paragraph">这段代码的结果将会像这样： </p>
<div class="code">
<pre><span class="xml-tag">&lt;books&gt;</span>
<span class="xml-tag">&lt;book title=<span class="xml-quote">"The Stand"</span> /&gt;</span>
<span class="xml-tag">&lt;book title=<span class="xml-quote">"The Shining"</span> /&gt;</span>
<span class="xml-tag">&lt;/books&gt;</span></pre>
</div>
<p class="paragraph">注意，当你使用标记生成器时，必须小心避免命名冲突。例如，这段代码将产生一个错误： </p>
<div class="code">
<pre>def list = {
def books = Book.list()  // naming conflict here
render(contentType:<span class="java-quote">"text/xml"</span>) {
books {
<span class="java-keyword">for</span>(b in results) {
book(title:b.title)
}
}
}
}</pre>
</div>
<p class="paragraph">原因是，这里的一个本地变量<code>books</code>企图作为方法被调用。
<p class="paragraph">
<h4>使用render方法输出JSON</h4>
<p class="paragraph"><code>render</code> 方法可以同样被用于输出JSON: </p>
<div class="code">
<pre>def list = {
def results = Book.list()
render(contentType:<span class="java-quote">"text/json"</span>) {
books {
<span class="java-keyword">for</span>(b in results) {
book(title:b.title)
}
}
}
}</pre>
</div>
<p class="paragraph">在这种情况下，结果就会是大致相同的： </p>
<div class="code">
<pre>[
{title:<span class="java-quote">"The Stand"</span>},
{title:<span class="java-quote">"The Shining"</span>}
]</pre>
</div>
<p class="paragraph">同样的命名冲突危险适用于JSON生成器。
<p class="paragraph">
<h4>自动XML列集(Marshalling)</h4>
<p class="paragraph">（译者注：在此附上对于列集(Marshalling)解释：对函数参数进行打包处理得过程，因为指针等数据，必须通过一定得转换，才能被另一组件所理解。可以说列集(Marshalling)是一种数据格式的转换方法。）
<p class="paragraph">Grails同样支持自动列集(Marshalling)领域类为XML通过特定的转换器。
<p class="paragraph">首先，导入<code>grails.converters</code> 类包到你的控制器（Controllers）中： </p>
<div class="code">
<pre><span class="java-keyword">import</span> grails.converters.*</pre>
</div>
<p class="paragraph">现在，你可以使用下列高度易读的语法来自动转换领域类成XML： </p>
<div class="code">
<pre>render Book.list() as XML</pre>
</div>
<p class="paragraph">输出结果看上去会像下列这样： </p>
<div class="code">
<pre>&lt;?xml version=<span class="java-quote">"1.0"</span> encoding=<span class="java-quote">"ISO-8859-1"</span>?&gt;
&lt;list&gt;
&lt;book id=<span class="java-quote">"1"</span>&gt;
&lt;author&gt;Stephen King&lt;/author&gt;
&lt;title&gt;The Stand&lt;/title&gt;
&lt;/book&gt;
&lt;book id=<span class="java-quote">"2"</span>&gt;
&lt;author&gt;Stephen King&lt;/author&gt;
&lt;title&gt;The Shining&lt;/title&gt;
&lt;/book&gt;
&lt;/list&gt;</pre>
</div>
<p class="paragraph">一个使用转换器的替代方法是使用Grails的codecs特性。codecs特性提供了encodeAsXML和encodeAsJSON方法: </p>
<div class="code">
<pre>def xml = Book.list().encodeAsXML()
render xml</pre>
</div>
<p class="paragraph">&nbsp;
<p class="paragraph">
<h4>自动JSON列集(Marshalling)</h4>
<p class="paragraph">Grails同样支持自动列集(Marshalling)为JSON通过同样的机制。简单替代<code>XML</code> 为<code>JSON</code> </p>
<div class="code">
<pre>render Book.list() as JSON</pre>
</div>
<p class="paragraph">输出结果看上去会像下列这样： </p>
<div class="code">
<pre>[
{<span class="java-quote">"id"</span>:1,
<span class="java-quote">"class"</span>:<span class="java-quote">"Book"</span>,
<span class="java-quote">"author"</span>:<span class="java-quote">"Stephen King"</span>,
<span class="java-quote">"title"</span>:<span class="java-quote">"The Stand"</span>},
{<span class="java-quote">"id"</span>:2,
<span class="java-quote">"class"</span>:<span class="java-quote">"Book"</span>,
<span class="java-quote">"author"</span>:<span class="java-quote">"Stephen King"</span>,
<span class="java-quote">"releaseDate"</span>:<span class="java-keyword">new</span> Date(1194127343161),
<span class="java-quote">"title"</span>:<span class="java-quote">"The Shining"</span>}
]</pre>
</div>
<p class="paragraph">再次作为一种替代，你可以使用<code>encodeAsJSON</code>达到相同的效果 </p><img src ="http://www.blogjava.net/rain1102/aggbug/206078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-06-05 16:21 <a href="http://www.blogjava.net/rain1102/archive/2008/06/05/206078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XMLSchema中的key和unique</title><link>http://www.blogjava.net/rain1102/archive/2008/03/29/189479.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Sat, 29 Mar 2008 08:16:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/03/29/189479.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/189479.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/03/29/189479.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/189479.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/189479.html</trackback:ping><description><![CDATA[<div id="article">
<p><font face="Verdana">关于XML Schema中的key和unique的概念很多Schema教程里面讲过，可惜网上大部分教程里面的例子是错误的，而且并没有给出完整清晰的解释，我查找了Schema的规范并写出了相应了例子，理清了这两个概念，希望对大家有所帮助。XML Schema规范来自于<br />
http://www.w3.org/TR/xmlschema-0/</font></p>
<p><font face="Verdana">1.unique的定义和例子<br />
规范中对于unique是这样定义的：XML Schema enables us to indicate that any attribute or element value must be unique within a certain scope. To indicate that one particular attribute or element value is unique, we use the unique element first to "select" a set of elements, and then to identify the attribute or element "field" relative to each selected element that has to be unique within the scope of the set of selected elements.<br />
译文：XML Schema允许我们指出任意的属性或者元素值在某个范围内是唯一的。为了指出这个属性或者元素值的唯一性，我们使用了unique元素，它首先&#8220;选择&#8221;一组元素，然后指出这个属性或者元素的&#8220;域&#8221;在上一步所选择出的元素集合中是唯一的。<br />
例子Schema：UniqueTest.xsd<br />
&lt;?xml version="1.0" encoding="GB2312"?&gt;<br />
&lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"&gt;<br />
&nbsp;&lt;xs:element name="Person"&gt;<br />
&nbsp; &lt;xs:annotation&gt;<br />
&nbsp;&nbsp; &lt;xs:documentation&gt;Comment describing your root element&lt;/xs:documentation&gt;<br />
&nbsp; &lt;/xs:annotation&gt;<br />
&nbsp; &lt;xs:complexType&gt;<br />
&nbsp;&nbsp; &lt;xs:sequence&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;xs:element name="Name" type="xs:string" maxOccurs="unbounded"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;xs:element name="Id" type="xs:integer" maxOccurs="unbounded"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/xs:element&gt;<br />
&nbsp;&nbsp; &lt;/xs:sequence&gt;<br />
&nbsp; &lt;/xs:complexType&gt;<br />
&nbsp; &lt;xs:unique name="IdUnique"&gt;<br />
&nbsp;&nbsp; &lt;xs:selector xpath=".//Id"/&gt;<br />
&nbsp;&nbsp; &lt;xs:field xpath="."/&gt;<br />
&nbsp; &lt;/xs:unique&gt;<br />
&nbsp;&lt;/xs:element&gt;<br />
&lt;/xs:schema&gt;</font></p>
<p><font face="Verdana">例子XML:UniqueTest.xml<br />
&lt;?xml version="1.0" encoding="GB2312"?&gt;<br />
&lt;Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="UniqueTest.xsd"&gt;<br />
&lt;Name&gt;wxb_nudt&lt;/Name&gt;<br />
&nbsp;&lt;Id&gt;1001&lt;/Id&gt;<br />
&nbsp;&lt;Id&gt;1002&lt;/Id&gt;<br />
&nbsp;&lt;Id&gt;1001&lt;/Id&gt; &lt;!--这儿就会报错，因为它的值和第一个Id重复了，并不是唯一的--&gt;<br />
&nbsp;&lt;Id&gt;1004&lt;/Id&gt;<br />
&lt;/Person&gt;</font></p>
<p><font face="Verdana">2.key的定义和例子<br />
规范中是通过一个较长的例子来说明key和keyref的定义，归纳起来可以做如下定义：XML Schema可以通过将一个元素或者属性定义为一个key，这个key必须是unique的，这个key可以在XML文档中的其他部分通过keyref进行引用，keyref的值一定取自于key的某一个值。key的概念很类似于数据库中的外键。<br />
key的具体定义方法很类似于unique的定义方法，首先&#8220;选择&#8221;一组元素，然后指出某个属性或者元素的&#8220;域&#8221;就是一个key。<br />
而keyref与key的定义完全相似，唯一的区别是加了一个refer属性，这个refer属性指出了key的名字，具体例子如下：<br />
例子schema：KeyExam.xsd<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!-- edited with XMLSPY v2004 rel. 3 U (http://www.xmlspy.com) by wxb (nudt) --&gt;<br />
&lt;xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"&gt;<br />
&nbsp;&lt;xsd:element name="rootElement"&gt;<br />
&nbsp; &lt;xsd:complexType&gt;<br />
&nbsp;&nbsp; &lt;xsd:sequence&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;xsd:element name="elementOne" maxOccurs="unbounded"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsd:complexType&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsd:attribute name="elementOneKey" type="xsd:integer"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsd:attribute name="elementOneDesc" type="xsd:string"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xsd:complexType&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/xsd:element&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;xsd:element name="elementTwo" maxOccurs="unbounded"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsd:complexType&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsd:attribute name="elementTwoKey" type="xsd:integer"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsd:attribute name="elementOneKey" type="xsd:string"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsd:attribute name="elementTwoDesc" type="xsd:string"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xsd:complexType&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/xsd:element&gt;<br />
&nbsp;&nbsp; &lt;/xsd:sequence&gt;<br />
&nbsp; &lt;/xsd:complexType&gt;<br />
&nbsp; &lt;xsd:key name="elementOnePK"&gt;<br />
&nbsp;&nbsp; &lt;xsd:selector xpath=".//elementOne"/&gt;<br />
&nbsp;&nbsp; &lt;xsd:field xpath="@elementOneDesc"/&gt;<br />
&nbsp; &lt;/xsd:key&gt;<br />
&nbsp; &lt;xsd:keyref name="elementOneFK" refer="elementOnePK"&gt;<br />
&nbsp;&nbsp; &lt;xsd:selector xpath=".//elementTwo"/&gt;<br />
&nbsp;&nbsp; &lt;xsd:field xpath="@elementTwoDesc"/&gt;<br />
&nbsp; &lt;/xsd:keyref&gt;<br />
&nbsp; &lt;xsd:unique name="EOneKeyU" xsi:type="xsd:integer"&gt;<br />
&nbsp;&nbsp; &lt;xsd:selector xpath=".//elementOne"/&gt;<br />
&nbsp;&nbsp; &lt;xsd:field xpath="@elementOneKey"/&gt;<br />
&nbsp; &lt;/xsd:unique&gt;<br />
&nbsp;&lt;/xsd:element&gt;<br />
&lt;/xsd:schema&gt;</font></p>
<p><font face="Verdana">例子xml：KeyExam.xml<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;rootElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="KeyExam.xsd"&gt;<br />
&nbsp;&lt;elementOne elementOneKey="1" elementOneDesc="a"/&gt;<br />
&nbsp;&lt;elementOne elementOneKey="2" elementOneDesc="b"/&gt;<br />
&nbsp;&lt;elementOne elementOneKey="3" elementOneDesc="c"/&gt;<br />
&nbsp;&lt;elementOne elementOneKey="4" elementOneDesc="d"/&gt;<br />
&nbsp;&lt;elementTwo elementOneKey="5" elementTwoDesc="e" elementTwoKey="78"/&gt;<br />
&nbsp;&lt;!--上面的elementTwoDesc作为elementOneDesc的一个keyref，它必须取值于上面的4个key值之一，这里它的值"e"因为不是取值于"a","b","c","d",所以会报错--&gt;<br />
&lt;/rootElement&gt;</font></p>
</div><img src ="http://www.blogjava.net/rain1102/aggbug/189479.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-03-29 16:16 <a href="http://www.blogjava.net/rain1102/archive/2008/03/29/189479.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Schema中的一些元素值和属性值约束</title><link>http://www.blogjava.net/rain1102/archive/2008/03/29/189435.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Sat, 29 Mar 2008 04:44:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/03/29/189435.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/189435.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/03/29/189435.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/189435.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/189435.html</trackback:ping><description><![CDATA[<p>&nbsp; </p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; color: red; font-family: 宋体">对一组值的约束（使用枚举）</span><span style="font-size: 12pt; font-family: 宋体"><br />
</span><span style="font-size: 10pt; font-family: 宋体">下述案例给名为"car"的元素定义了约束条件，符合条件的值有：Audi、Golf、BMW：<br />
</span><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;xs:element name="car"&gt; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;xs:simpleType&gt;<br />
&nbsp;&lt;xs:restriction base="xs:string"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;xs:enumeration value="Audi"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;xs:enumeration value="Golf"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;xs:enumeration value="BMW"/&gt;<br />
&nbsp;&lt;/xs:restriction&gt;<br />
&lt;/xs:simpleType&gt; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;/xs:element&gt; &nbsp; </span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: red; font-family: 宋体">对一系列值的约束&nbsp;</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">下述案例给名为"letter"的元素定义了约束条件。唯一符合条件的值是从 a 到 z 之间的一个小写字母：</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;xs:element name="letter"&gt;</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;xs:simpleType&gt;</span></p>
<p style="text-indent: 12pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;xs:restriction base="xs:string"&gt;</span></p>
<p style="text-indent: 24pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;xs:pattern value="[a-z]"/&gt;</span></p>
<p style="text-indent: 12pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;/xs:restriction&gt;</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;/xs:simpleType&gt;</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;/xs:element&gt;</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体">下述案例给名为"gender"的元素定义了一个约束条件。唯一符合的值是male （男性）或female（女性）：</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;xs:element name="gender"&gt;</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;xs:simpleType&gt;</span></p>
<p style="text-indent: 12pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;xs:restriction base="xs:string"&gt;</span></p>
<p style="text-indent: 24pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;xs:pattern value="male|female"/&gt;</span></p>
<p style="text-indent: 12pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;/xs:restriction&gt;</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;/xs:simpleType&gt;</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;/xs:element&gt;</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: red; font-family: 宋体">对空白符的约束</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体">下述案例给名为"address"的元素定义了一个约束条件。空白符设置为"preserve"（保留），这意味着XML处理器不会删除任何空白符：</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;xs:element name="address"&gt;</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;xs:simpleType&gt;</span></p>
<p style="text-indent: 12pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;xs:restriction base="xs:string"&gt;</span></p>
<p style="text-indent: 24pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;xs:whiteSpace value="</span><span style="font-size: 12pt; color: #333399; font-family: 宋体">preserve</span><span style="font-size: 12pt; color: green; font-family: 宋体">"/&gt;</span></p>
<p style="text-indent: 12pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;/xs:restriction&gt;</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;/xs:simpleType&gt;</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;/xs:element&gt;</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">下述案例给名为"address"的元素定义了一个约束条件。空白符设置为" replace "（替代），这意味着XML处理器会用空格替代所有的空白字符（其中包括：换行符、制表符、空格符、回车符）：</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;xs:element name="address"&gt;</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;xs:simpleType&gt;</span></p>
<p style="text-indent: 12pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;xs:restriction base="xs:string"&gt;</span></p>
<p style="text-indent: 24pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;xs:whiteSpace value="</span><span style="font-size: 12pt; color: #333399; font-family: 宋体">replace</span><span style="font-size: 12pt; color: green; font-family: 宋体">"/&gt;</span></p>
<p style="text-indent: 12pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;/xs:restriction&gt;</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;/xs:simpleType&gt;</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;/xs:element&gt;</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">下述案例给名为"address"的元素定义了一个约束条件。空白符设置为"collapse"（清除），这意味着XML处理器会清除所有的空白字符（换行符、制表符、空格符以及回车符都被空格符替代。头部、尾部的空格会被清除，多个空格也会自动减少为一个）：</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;xs:element name="address"&gt;</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;xs:simpleType&gt;</span></p>
<p style="text-indent: 12pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;xs:restriction base="xs:string"&gt;</span></p>
<p style="text-indent: 24pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;xs:whiteSpace value="</span><span style="font-size: 12pt; color: #333399; font-family: 宋体">collapse</span><span style="font-size: 12pt; color: green; font-family: 宋体">"/&gt;</span></p>
<p style="text-indent: 12pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;/xs:restriction&gt;</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;/xs:simpleType&gt;</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: green; font-family: 宋体">&lt;/xs:element&gt;</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-family: 宋体">对数据类型的约束</span></p>
<p>
<table style="width: 563px; height: 812px" cellspacing="0" cellpadding="0" width="563" border="1">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; width: 15%; padding-top: 0.75pt" valign="top" width="15%">
            <p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 宋体">Constraint<br />
            </span></strong><strong><span style="font-size: 12pt; font-family: 宋体">约束</span></strong></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; width: 85%; padding-top: 0.75pt" valign="top" width="85%">
            <p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 宋体">Description<br />
            </span></strong><strong><span style="font-size: 12pt; font-family: 宋体">说明</span></strong></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">enumeration</span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">Defines a list of acceptable values<br />
            </span><span style="font-size: 12pt; font-family: 宋体">定义了一系列的有效值</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">fractionDigits</span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">Specifies the maximum number of decimal places allowed. Must be equal to or greater than zero<br />
            </span><span style="font-size: 12pt; font-family: 宋体">指定了允许出现的小数位数的最大位数。值必须大于等于0</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">length</span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">Specifies the exact number of characters or list items allowed. Must be equal to or greater than zero<br />
            </span><span style="font-size: 12pt; font-family: 宋体">指定了允许出现的字符或列表项的个数。值必须大于等于0</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">maxExclusive</span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">Specifies the upper bounds for numeric values (the value must be less than this value)<br />
            </span><span style="font-size: 12pt; font-family: 宋体">指定了数值上限（数值必须小于该值）</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">maxInclusive</span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">Specifies the upper bounds for numeric values (the value must be less than or equal to this value)<br />
            </span><span style="font-size: 12pt; font-family: 宋体">指定了数值上限（数值必须小于等于该值）</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">maxLength</span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">Specifies the maximum number of characters or list items allowed. Must be equal to or greater than zero<br />
            </span><span style="font-size: 12pt; font-family: 宋体">指定了允许出现的字符或列表项的最大个数。值必须大于等于0</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">minExclusive</span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">Specifies the lower bounds for numeric values (the value must be greater than this value)<br />
            </span><span style="font-size: 12pt; font-family: 宋体">指定了数值的下限 （数值必须大于该值）</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">minInclusive</span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">Specifies the lower bounds for numeric values (the value must be greater than or equal to this value)<br />
            </span><span style="font-size: 12pt; font-family: 宋体">指定了数值的下限（数值必须大于等于该值）</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">minLength</span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">Specifies the minimum number of characters or list items allowed. Must be equal to or greater than zero<br />
            </span><span style="font-size: 12pt; font-family: 宋体">指定了允许出现的字符或列表的最小个数。值必须大于等于0</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">pattern</span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">Defines the exact sequence of characters that are acceptable <br />
            </span><span style="font-size: 12pt; font-family: 宋体">定义了符合要求的字符的精确排列顺序</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">totalDigits</span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">Specifies the exact number of digits allowed. Must be greater than zero<br />
            </span><span style="font-size: 12pt; font-family: 宋体">指定了允许出现的字符的精确个数。值必须大于0</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">whiteSpace</span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">Specifies how white space (line feeds, tabs, spaces, and carriage returns) is handled<br />
            </span><span style="font-size: 12pt; font-family: 宋体">指定了空白符的处理方式（其中包括：换行符、制表符、空格符和回车符）</span></p>
            </td>
        </tr>
    </tbody>
</table>
</p><img src ="http://www.blogjava.net/rain1102/aggbug/189435.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-03-29 12:44 <a href="http://www.blogjava.net/rain1102/archive/2008/03/29/189435.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>根据Schema使用javax.xml.validation.Validator验证XML</title><link>http://www.blogjava.net/rain1102/archive/2008/03/27/189137.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 27 Mar 2008 13:46:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/03/27/189137.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/189137.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/03/27/189137.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/189137.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/189137.html</trackback:ping><description><![CDATA[<p><strong>SchemaValidation .java<br />
</strong><span style="color: #008000"><br />
package com.founder.xml;</span></p>
<p><span style="color: #008000">import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.io.IOException;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.io.InputStream;</span></p>
<p><span style="color: #008000">import javax.xml.XMLConstants;<br />
import javax.xml.parsers.ParserConfigurationException;<br />
import javax.xml.transform.stream.StreamSource;<br />
import javax.xml.validation.Schema;<br />
import javax.xml.validation.SchemaFactory;<br />
import javax.xml.validation.Validator;</span></p>
<p><span style="color: #008000">import org.xml.sax.SAXException;</span></p>
<p><span style="color: #008000">public class SchemaValidation {</span></p>
<p><span style="color: #008000">&nbsp;/**<br />
&nbsp; * @param args<br />
&nbsp; * @throws IOException<br />
&nbsp; * @throws SAXException<br />
&nbsp; * @throws ParserConfigurationException<br />
&nbsp; */<br />
&nbsp;public static void main(String[] args) throws ParserConfigurationException,<br />
&nbsp;&nbsp;&nbsp;SAXException, IOException {<br />
&nbsp;&nbsp;SchemaValidation sv = new SchemaValidation();<br />
&nbsp;&nbsp;sv.validate();<br />
&nbsp;}</span></p>
<p><span style="color: #008000">&nbsp;public void validate() {<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;String strLang = XMLConstants.W3C_XML_SCHEMA_NS_URI;<br />
&nbsp;&nbsp;&nbsp;SchemaFactory factory = SchemaFactory.newInstance(strLang);</span></p>
<p><span style="color: #008000">&nbsp;&nbsp;&nbsp;InputStream isSchema = getClass().getResourceAsStream("/founder.xsd");<br />
&nbsp;&nbsp;&nbsp;StreamSource ss = new StreamSource(isSchema);<br />
&nbsp;&nbsp;&nbsp;Schema schema = factory.newSchema(ss);</span></p>
<p><span style="color: #008000">&nbsp;&nbsp;&nbsp;Validator validator = schema.newValidator();<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;InputStream isXML = getClass().getResourceAsStream("/founder.xml");<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;StreamSource source = new StreamSource(isXML);<br />
&nbsp;&nbsp;&nbsp;validator.validate(source);<br />
&nbsp;&nbsp;&nbsp;System.out.println("Result : Valid!");</span></p>
<p><span style="color: #008000">&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;System.out.println("Result : Invalid!");<br />
&nbsp;&nbsp;}</span></p>
<p><span style="color: #008000">&nbsp;}</span></p>
<p><span style="color: #008000">}<br />
<br />
<br />
<span style="color: #000000"><strong>founder.xsd</strong></span><br />
<br />
&lt;?xml version="1.0"?&gt;<br />
&lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"<br />
&nbsp;xmlns="http://www.founder.com" elementFormDefault="qualified"&gt;<br />
&nbsp;&lt;xs:element name="note"&gt;<br />
&nbsp;&nbsp;&lt;xs:complexType&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;xs:sequence&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element name="to" type="xs:string" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element name="from" type="xs:string" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element name="heading" type="xs:string" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element name="body" type="xs:string" /&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/xs:sequence&gt;<br />
&nbsp;&nbsp;&lt;/xs:complexType&gt;<br />
&nbsp;&lt;/xs:element&gt;<br />
&lt;/xs:schema&gt;<br />
<br />
<br />
<span style="color: #000000"><strong>founder.xml</strong></span><br />
<br />
&lt;?xml version="1.0"?&gt;<br />
&lt;note xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
&nbsp;xsi:schemaLocation="http://www.founder.com founder.xsd"&gt;<br />
&nbsp;&lt;to&gt;Tove&lt;/to&gt;<br />
&nbsp;&lt;from&gt;Jani&lt;/from&gt;<br />
&nbsp;&lt;heading&gt;Reminder&lt;/heading&gt;<br />
&nbsp;&lt;body&gt;Don't forget me this weekend!&lt;/body&gt;<br />
&lt;/note&gt;<br />
<br />
<br />
<br />
</span></p><img src ="http://www.blogjava.net/rain1102/aggbug/189137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-03-27 21:46 <a href="http://www.blogjava.net/rain1102/archive/2008/03/27/189137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RSS</title><link>http://www.blogjava.net/rain1102/archive/2008/01/18/176345.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Fri, 18 Jan 2008 14:14:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/01/18/176345.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/176345.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/01/18/176345.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/176345.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/176345.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1．RSS 介绍RSS是利用XML把一个网站的内容发送给其他网站的方式。RSS允许快速浏览新闻与更新。什么是RSS？RSS是在线共享内容的一种简易方式（也叫聚合内容，Really Simple Syndication），Rss允许联合站点内容，Rss定义了一个简单的方式来共享和查看标题及内容。Rss文件可以自动更新，Rss允许个人查看不同站点，Rss是用XML编写的。为什么要使用R...&nbsp;&nbsp;<a href='http://www.blogjava.net/rain1102/archive/2008/01/18/176345.html'>阅读全文</a><img src ="http://www.blogjava.net/rain1102/aggbug/176345.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-01-18 22:14 <a href="http://www.blogjava.net/rain1102/archive/2008/01/18/176345.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML/XSL-FO</title><link>http://www.blogjava.net/rain1102/archive/2008/01/18/176203.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Fri, 18 Jan 2008 06:36:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/01/18/176203.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/176203.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/01/18/176203.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/176203.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/176203.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在学习XSL-FO之前，你应该已经掌握了XML和XML命名空间的基本知识。1．什么是XSL-FO？XSL-FO 是用于将结果格式化成XML数据的语言，XSL-FO全称为（Extensible Stylesheet Language Formatting Objects：扩展格式化对象样式表语言），XSL-FO 是W3C的推荐标准，XSL-FO 现在通常被称为XSL。XSL-FO 是用于...&nbsp;&nbsp;<a href='http://www.blogjava.net/rain1102/archive/2008/01/18/176203.html'>阅读全文</a><img src ="http://www.blogjava.net/rain1102/aggbug/176203.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-01-18 14:36 <a href="http://www.blogjava.net/rain1102/archive/2008/01/18/176203.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Schema (XSD) 教程</title><link>http://www.blogjava.net/rain1102/archive/2008/01/17/175861.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 17 Jan 2008 02:53:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/01/17/175861.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/175861.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/01/17/175861.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/175861.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/175861.html</trackback:ping><description><![CDATA[<a href="http://www.w3pop.com/learn/index/f/6/c/30/o/0/size/20/p/1/" target="_blank"><span style="font-size: 10pt">Schema (XSD) 教程</span></a><span style="font-size: 10pt"> <br />
</span><img src ="http://www.blogjava.net/rain1102/aggbug/175861.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-01-17 10:53 <a href="http://www.blogjava.net/rain1102/archive/2008/01/17/175861.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XMLDOM对象方法手册</title><link>http://www.blogjava.net/rain1102/archive/2006/10/17/75578.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 17 Oct 2006 04:48:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/10/17/75578.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/75578.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/10/17/75578.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/75578.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/75578.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: XMLDOM				对象方法手册																																		&#178;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 				Document				对象方法																												abort				...&nbsp;&nbsp;<a href='http://www.blogjava.net/rain1102/archive/2006/10/17/75578.html'>阅读全文</a><img src ="http://www.blogjava.net/rain1102/aggbug/75578.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-10-17 12:48 <a href="http://www.blogjava.net/rain1102/archive/2006/10/17/75578.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 语言的 XPath API</title><link>http://www.blogjava.net/rain1102/archive/2006/09/18/70267.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 18 Sep 2006 05:34:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/09/18/70267.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/70267.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/09/18/70267.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/70267.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/70267.html</trackback:ping><description><![CDATA[<blockquote>XPath 表达式比繁琐的文档对象模型（DOM）导航代码要容易编写得多。如果需要从 XML 文档中提取信息，最快捷、最简单的办法就是在 <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>&#8482; 程序中嵌入 XPath 表达式。Java 5 推出了 javax.xml.xpath 包，这是一个用于 XPath 文档查询的独立于 XML 对象模型的库。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>如果要告诉别人买一加仑牛奶，您会怎么说？&#8220;请去买一加仑牛奶回来&#8221; 还是 &#8220;从前门出去，向左转，走三个街区向右转，再走半个街区向右转进入商店。走向四号通道，沿通道走五米向左，拿一瓶一加仑装的牛奶然后到收银台付款。再沿原路回家。&#8221; 简直太可笑了。只要在 &#8220;请去买一加仑牛奶回来&#8221; 的基础上稍加指示，多数成人都能自己买回牛奶来。 </p>
		<p>查询语言和计算机搜索与此类似。直接说 &#8220;找一个 Cryptonomicon 的副本&#8221; 要比编写搜索某个数据库的详细逻辑容易得多。由于搜索操作的逻辑非常相似，可以发明一种通用语言让您使用 &#8220;找到 Neal Stephenson 的所有著作&#8221; 这样的命令，然后编写对特定数据存储执行此类查询的引擎。 </p>
		<p>
				<a name="N1006A">
						<span class="atitle">
								<font face="Arial" size="4">XPath</font>
						</span>
				</a>
		</p>
		<p>在众多查询语言之中，结构化查询语言（SQL）是一种针对查询特定类型的关系库而设计和优化的语言。其他不那么常见的查询语言还有对象查询语言（OQL）和 XQuery。但本文的主题是 XPath，一种为查询 XML 文档而设计的查询语言。比如，下面这个简单的 XPath 查询可以在文档中找到作者为 Neal Stephenson 的所有图书的标题：</p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">//book[author="Neal Stephenson"]/title</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>作为对照，查询同样信息的纯 DOM 搜索代码如 <a href="http://www-128.ibm.com/developerworks/cn/xml/x-javaxpathapi.html#listing1"><font color="#996699">清单 1</font></a> 所示：</p>
		<br />
		<a name="listing1">
				<b>清单 1. 找到 Neal Stephenson 所有著作 title 元素的 DOM 代码</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">        ArrayList result = new ArrayList();
        NodeList books = doc.getElementsByTagName("book");
        for (int i = 0; i &lt; books.getLength(); i++) {
            Element book = (Element) books.item(i);
            NodeList authors = book.getElementsByTagName("author");
            boolean stephenson = false;
            for (int j = 0; j &lt; authors.getLength(); j++) {
                Element author = (Element) authors.item(j);
                NodeList children = author.getChildNodes();
                StringBuffer sb = new StringBuffer();
                for (int k = 0; k &lt; children.getLength(); k++) {
                    Node child = children.item(k);
                    // really should to do this recursively
                    if (child.getNodeType() == Node.TEXT_NODE) {
                        sb.append(child.getNodeValue());
                    }
                }
                if (sb.toString().equals("Neal Stephenson")) {
                    stephenson = true;
                    break;
                }

            }

            if (stephenson) {
                NodeList titles = book.getElementsByTagName("title");
                for (int j = 0; j &lt; titles.getLength(); j++) {
                    result.add(titles.item(j));
                }
            }

        }</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>不论您是否相信，<a href="http://www-128.ibm.com/developerworks/cn/xml/x-javaxpathapi.html#listing1"><font color="#996699">清单 1</font></a> 中的 DOM 显然不如简单的 XPath 表达式通用或者健壮。您愿意编写、调试和维护哪一个？我想答案很明显。 </p>
		<p>但是虽然有很强的表达能力，XPath 并不是 <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> 语言，事实上 XPath 不是一种完整的编程语言。有很多东西用 XPath 表达不出来，甚至有些查询也无法表达。比方说，XPath 不能查找国际标准图书编码（ISBN）检验码不匹配的所有图书，或者找出境外帐户数据库显示欠帐的所有作者。幸运的是，可以把 XPath 结合到 <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> 程序中，这样就能发挥两者的优势了：Java 做 <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> 所擅长的，XPath 做 XPath 所擅长的。 </p>
		<p>直到最近，Java 程序执行 XPath 查询所需要的应用程序编程接口（API）还因形形色色的 XPath 引擎而各不相同。Xalan 有一种 API，Saxon 使用另一种，其他引擎则使用其他的 API。这意味着代码往往把您限制到一种产品上。理想情况下，最好能够试验具有不同性能特点的各种引擎，而不会带来不适当的麻烦或者重新编写代码。 </p>
		<p>于是，Java 5 推出了 <code>javax.xml.xpath</code> 包，提供一个引擎和对象模型独立的 XPath 库。这个包也可用于 <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> 1.3 及以后的版本，但需要单独安装 <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> API for XML Processing (JAXP) 1.3。Xalan 2.7 和 Saxon 8 以及其他产品包含了这个库的实现。 </p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/xml/x-javaxpathapi.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1009B">
						<span class="atitle">
								<font face="Arial" size="4">一个简单的例子</font>
						</span>
				</a>
		</p>
		<p>我将举例说明如何使用它。然后再讨论一些细节问题。假设要查询一个图书列表，寻找 Neal Stephenson 的著作。具体来说，这个图书列表的形式如 <a href="http://www-128.ibm.com/developerworks/cn/xml/x-javaxpathapi.html#listing2"><font color="#996699">清单 2</font></a> 所示： </p>
		<br />
		<a name="listing2">
				<b>清单 2. 包含图书信息的 XML 文档</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">&lt;inventory&gt;
    &lt;book year="2000"&gt;
        &lt;title&gt;Snow Crash&lt;/title&gt;
        &lt;author&gt;Neal Stephenson&lt;/author&gt;
        &lt;publisher&gt;Spectra&lt;/publisher&gt;
        &lt;isbn&gt;0553380958&lt;/isbn&gt;
        &lt;price&gt;14.95&lt;/price&gt;
    &lt;/book&gt;
 
    &lt;book year="2005"&gt;
        &lt;title&gt;Burning Tower&lt;/title&gt;
        &lt;author&gt;Larry Niven&lt;/author&gt;
        &lt;author&gt;Jerry Pournelle&lt;/author&gt;
        &lt;publisher&gt;Pocket&lt;/publisher&gt;
        &lt;isbn&gt;0743416910&lt;/isbn&gt;
        &lt;price&gt;5.99&lt;/price&gt;
    &lt;book&gt;
 
    &lt;book year="1995"&gt;
        &lt;title&gt;Zodiac&lt;/title&gt;
        &lt;author&gt;Neal Stephenson&lt;author&gt;
        &lt;publisher&gt;Spectra&lt;/publisher&gt;
        &lt;isbn&gt;0553573862&lt;/isbn&gt;
        &lt;price&gt;7.50&lt;/price&gt;
    &lt;book&gt;

    &lt;!-- more books... --&gt;
 
&lt;/inventory&gt;</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<table cellspacing="0" cellpadding="0" width="65%" align="right" border="0">
				<tbody>
						<tr>
								<td width="10">
										<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
								</td>
								<td>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td bgcolor="#eeeeee">
																		<a name="N100B3">
																				<b>抽象工厂</b>
																		</a>
																		<br />
																		<p>
																				<code>XPathFactory</code> 是一个抽象工厂。抽象工厂设计模式使得这一种 API 能够支持不同的对象模型，如 DOM、JDOM 和 XOM。为了选择不同的模型，需要向 <code>XPathFactory.newInstance()</code> 方法传递标识对象模型的统一资源标识符（URI）。比如 http://xom.nu/ 可以选择 XOM。但实际上，到目前为止 DOM 是该 API 支持的惟一对象模型。 </p>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<p>查找所有图书的 XPath 查询非常简单：<code>//book[author="Neal Stephenson"]</code>。为了找出这些图书的标题，只要增加一步，表达式就变成了 <code>//book[author="Neal Stephenson"]/title</code>。最后，真正需要的是 <code>title</code> 元素的文本节点孩子。这就要求再增加一步，完整的表达式就是 <code>//book[author="Neal Stephenson"]/title/text()</code>。 </p>
		<p>现在我提供一个简单的程序，它从 <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> 语言中执行这个查询，然后把找到的所有图书的标题打印出来。首先，需要将文档加载到一个 DOM <code>Document</code> 对象中。为了简化起见，假设该文档在当前工作目录的 books.xml 文件中。下面的简单代码片段解析文档并建立对应的 <code>Document</code> 对象： </p>
		<br />
		<a name="listing3">
				<b>清单 3. 用 JAXP 解析文档</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true); // never forget this!
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.parse("books.xml");</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>到目前为止，这仅仅是标准的 JAXP 和 DOM，没有什么新鲜的。 </p>
		<p>接下来创建 <code>XPathFactory</code>：</p>
		<table cellspacing="0" cellpadding="5" width="60%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">XPathFactory factory = XPathFactory.newInstance();</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>然后使用这个工厂创建 <code>XPath</code> 对象： </p>
		<table cellspacing="0" cellpadding="5" width="60%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">XPath xpath = factory.newXPath();</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<code>XPath</code> 对象编译 XPath 表达式： </p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">PathExpression expr = xpath.compile("//book[author='Neal Stephenson']/title/text()");</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<table cellspacing="0" cellpadding="0" width="65%" align="right" border="0">
				<tbody>
						<tr>
								<td width="10">
										<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
								</td>
								<td>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td bgcolor="#eeeeee">
																		<a name="N10114">
																				<b>直接求值</b>
																		</a>
																		<br />
																		<p>如果 XPath 表达式只使用一次，可以跳过编译步骤直接对 <code>XPath</code> 对象调用 <code>evaluate()</code> 方法。但是，如果同一个表达式要重复使用多次，编译可能更快一些。 </p>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<p>最后，计算 XPath 表达式得到结果。表达式是针对特定的上下文节点计算的，在这个例子中是整个文档。还必须指定返回类型。这里要求返回一个节点集： </p>
		<table cellspacing="0" cellpadding="5" width="60%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">Object result = expr.evaluate(doc, XPathConstants.NODESET);</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>可以将结果强制转化成 DOM <code>NodeList</code>，然后遍历列表得到所有的标题： </p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">        NodeList nodes = (NodeList) result;
        for (int i = 0; i &lt; nodes.getLength(); i++) {
            System.out.println(nodes.item(i).getNodeValue()); 
        }</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/x-javaxpathapi.html#listing4">
						<font color="#996699">清单 4</font>
				</a> 把上述片段组合到了一个程序中。还要注意，这些方法可能抛出一些检查异常，这些异常必须在 <code>throws</code> 子句中声明，但是我在上面把它们掩盖起来了： </p>
		<br />
		<a name="listing4">
				<b>清单 4. 用固定的 XPath 表达式查询 XML 文档的完整程序</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.io.IOException;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import javax.xml.parsers.*;
import javax.xml.xpath.*;

public class XPathExample {

  public static void main(String[] args) 
   throws ParserConfigurationException, SAXException, 
          IOException, XPathExpressionException {

    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
    domFactory.setNamespaceAware(true); // never forget this!
    DocumentBuilder builder = domFactory.newDocumentBuilder();
    Document doc = builder.parse("books.xml");

    XPathFactory factory = XPathFactory.newInstance();
    XPath xpath = factory.newXPath();
    XPathExpression expr 
     = xpath.compile("//book[author='Neal Stephenson']/title/text()");

    Object result = expr.evaluate(doc, XPathConstants.NODESET);
    NodeList nodes = (NodeList) result;
    for (int i = 0; i &lt; nodes.getLength(); i++) {
        System.out.println(nodes.item(i).getNodeValue()); 
    }

  }

}</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="N1014E">
						<span class="smalltitle">
								<strong>
										<font face="Arial">XPath 数据模型</font>
								</strong>
						</span>
				</a>
		</p>
		<p>每当混合使用诸如 XPath 和 <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> 这样两种不同的语言时，必定会有某些将两者粘合在一起的明显接缝。并非一切都很合拍。XPath 和 <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> 语言没有同样的类型系统。XPath 1.0 只有四种基本数据类型：</p>
		<ul>
				<li>node-set 
</li>
				<li>number 
</li>
				<li>boolean 
</li>
				<li>string </li>
		</ul>
		<p>当然，Java 语言有更多的数据类型，包括用户定义的对象类型。</p>
		<p>多数 XPath 表达式，特别是位置路径，都返回节点集。但是还有其他可能。比如，XPath 表达式 <code>count(//book)</code> 返回文档中的图书数量。XPath 表达式 <code>count(//book[@author="Neal Stephenson"]) &gt; 10</code> 返回一个布尔值：如果文档中 Neal Stephenson 的著作超过 10 本则返回 true，否则返回 false。 </p>
		<p>
				<code>evaluate()</code> 方法被声明为返回 <code>Object</code>。实际返回什么依赖于 XPath 表达式的结果以及要求的类型。一般来说，XPath 的</p>
		<ul>
				<li>number 映射为 <code><a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.lang.Double</code></li>
				<li>string 映射为 <code><a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.lang.String</code></li>
				<li>boolean 映射为 <code><a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.lang.Boolean</code></li>
				<li>node-set 映射为 <code>org.w3c.dom.NodeList</code></li>
		</ul>
		<table cellspacing="0" cellpadding="0" width="55%" align="right" border="0">
				<tbody>
						<tr>
								<td width="10">
										<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
								</td>
								<td>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td bgcolor="#eeeeee">
																		<a name="N1019C">
																				<b>XPath 2</b>
																		</a>
																		<br />
																		<p>前面一直假设您使用的是 XPath 1.0。XPath 2 大大扩展和修改了类型系统。Java XPath API 支持 XPath 2 所需的主要修改是为返回 XPath 2 新数据类型增加常量。 </p>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<p>在 <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> 中计算 XPath 表达式时，第二个参数指定需要的返回类型。有五种可能，都在 <code>javax.xml.xpath.XPathConstants</code> 类中命名了常量： </p>
		<ul>
				<li>
						<code>XPathConstants.NODESET</code>
				</li>
				<li>
						<code>XPathConstants.BOOLEAN</code>
				</li>
				<li>
						<code>XPathConstants.NUMBER</code>
				</li>
				<li>
						<code>XPathConstants.STRING</code>
				</li>
				<li>
						<code>XPathConstants.NODE</code>
				</li>
		</ul>
		<p>最后一个 <code>XPathConstants.NODE</code> 实际上没有匹配的 XPath 类型。只有知道 XPath 表达式只返回一个节点或者只需要一个节点时才使用它。如果 XPath 表达式返回了多个节点并且指定了 <code>XPathConstants.NODE</code>，则 <code>evaluate()</code> 按照文档顺序返回第一个节点。如果 XPath 表达式选择了一个空集并指定了 <code>XPathConstants.NODE</code>，则 <code>evaluate()</code> 返回 null。 </p>
		<p>如果不能完成要求的转换，<code>evaluate()</code> 将抛出 <code>XPathException</code>。 </p>
		<hr />
		<p>
				<a name="N101EB">
						<span class="atitle">
								<font face="Arial" size="4">名称空间上下文</font>
						</span>
				</a>
		</p>
		<p>若 XML 文档中的元素在名称空间中，查询该文档的 XPath 表达式必须使用相同的名称空间。XPath 表达式不一定要使用相同的前缀，只需要名称空间 URI 相同即可。事实上，如果 XML 文档使用默认名称空间，那么尽管目标文档没有使用前缀，XPath 表达式也必须使用前缀。 </p>
		<p>但是，Java 程序不是 XML 文档，因此不能用一般的名称空间解析。必须提供一个对象将前缀映射到名称空间 URI。该对象是 <code>javax.xml.namespace.NamespaceContext</code> 接口的实例。比如，假设图书文档放在 http://www.example.com/books 名称空间中，如 <a href="http://www-128.ibm.com/developerworks/cn/xml/x-javaxpathapi.html#listing5"><font color="#996699">清单 5</font></a> 所示： </p>
		<br />
		<a name="listing5">
				<b>清单 5. 使用默认名称空间的 XML 文档</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">&lt;inventory xmlns="http://www.example.com/books"&gt;
    &lt;book year="2000"&gt;
        &lt;title&gt;Snow Crash&lt;/title&gt;
        &lt;author&gt;Neal Stephenson&lt;/author&gt;
        &lt;publisher&gt;Spectra&lt;/publisher&gt;
        &lt;isbn&gt;0553380958&lt;/isbn&gt;
        &lt;price&gt;14.95&lt;price&gt;
    &lt;/book&gt;

    &lt;!-- more books... --&gt;

&lt;inventory&gt;</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>查找 Neal Stephenson 全部著作标题的 XPath 表达式就要改为 <code>//pre:book[pre:author="Neal Stephenson"]/pre:title/text()</code>。但是，必须将前缀 <code>pre</code> 映射到 URI http://www.example.com/books。<code>NamespaceContext</code> 接口在 <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> 软件开发工具箱（JDK）或 JAXP 中没有默认实现似乎有点笨，但确实如此。不过，自己实现也不难。<a href="http://www-128.ibm.com/developerworks/cn/xml/x-javaxpathapi.html#listing6"><font color="#996699">清单 6</font></a> 对一个名称空间给出了简单的实现。还需要映射 <code>xml</code> 前缀。 </p>
		<br />
		<a name="listing6">
				<b>清单 6. 绑定一个名称空间和默认名称空间的简单上下文</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.util.Iterator;
import javax.xml.*;
import javax.xml.namespace.NamespaceContext;

public class PersonalNamespaceContext implements NamespaceContext {

    public String getNamespaceURI(String prefix) {
        if (prefix == null) throw new NullPointerException("Null prefix");
        else if ("pre".equals(prefix)) return "http://www.example.org/books";
        else if ("xml".equals(prefix)) return XMLConstants.XML_NS_URI;
        return XMLConstants.NULL_NS_URI;
    }

    // This method isn't necessary for XPath processing.
    public String getPrefix(String uri) {
        throw new UnsupportedOperationException();
    }

    // This method isn't necessary for XPath processing either.
    public Iterator getPrefixes(String uri) {
        throw new UnsupportedOperationException();
    }

}</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>使用映射存储绑定和增加 setter 方法实现名称空间上下文的重用也不难。 </p>
		<p>创建 <code>NamespaceContext</code> 对象后，在编译表达式之前将其安装到 <code>XPath</code> 对象上。以后就可以像以前一样是用这些前缀查询了。比如： </p>
		<br />
		<a name="listing7">
				<b>清单 7. 使用名称空间的 XPath 查询</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">  XPathFactory factory = XPathFactory.newInstance();
  XPath xpath = factory.newXPath();
  xpath.setNamespaceContext(new PersonalNamespaceContext());
  XPathExpression expr 
    = xpath.compile("//pre:book[pre:author='Neal Stephenson']/pre:title/text()");

  Object result = expr.evaluate(doc, XPathConstants.NODESET);
  NodeList nodes = (NodeList) result;
  for (int i = 0; i &lt; nodes.getLength(); i++) {
      System.out.println(nodes.item(i).getNodeValue()); 
  }</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<hr />
		<p>
				<a name="N1023E">
						<span class="atitle">
								<font face="Arial" size="4">函数求解器</font>
						</span>
				</a>
		</p>
		<p>有时候，在 <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> 语言中定义用于 XPath 表达式的扩展函数很有用。这些函数可以执行用纯 XPath 很难或者无法执行的任务。不过必须是真正的函数，而不是随意的方法。就是说不能有副作用。（XPath 函数可以按照任意的顺序求值任意多次。） </p>
		<p>通过 <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> XPath API 访问的扩展函数必须实现 <code>javax.xml.xpath.XPathFunction</code> 接口。这个接口只声明了一个方法 evaluate： </p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">public Object evaluate(List args) throws XPathFunctionException</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>该方法必须返回 <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> 语言能够转换到 XPath 的五种类型之一： </p>
		<ul>
				<li>
						<code>String</code>
				</li>
				<li>
						<code>Double</code>
				</li>
				<li>
						<code>Boolean</code>
				</li>
				<li>
						<code>Nodelist</code>
				</li>
				<li>
						<code>Node</code>
				</li>
		</ul>
		<p>比如，<a href="http://www-128.ibm.com/developerworks/cn/xml/x-javaxpathapi.html#listing8"><font color="#996699">清单 8</font></a> 显示了一个扩展函数，它检查 ISBN 的校验和并返回 <code>Boolean</code>。这个校验和的基本规则是前九位数的每一位乘上它的位置（即第一位数乘上 1，第二位数乘上 2，依次类推）。将这些数加起来然后取除以 11 的余数。如果余数是 10，那么最后一位数就是 X。 </p>
		<br />
		<a name="listing8">
				<b>清单 8. 检查 ISBN 的 XPath 扩展函数</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.util.List;
import javax.xml.xpath.*;
import org.w3c.dom.*;

public class ISBNValidator implements XPathFunction {

  // This class could easily be implemented as a Singleton.
    
  public Object evaluate(List args) throws XPathFunctionException {

    if (args.size() != 1) {
      throw new XPathFunctionException("Wrong number of arguments to valid-isbn()");
    }

    String isbn;
    Object o = args.get(0);

    // perform conversions
    if (o instanceof String) isbn = (String) args.get(0);
    else if (o instanceof Boolean) isbn = o.toString();
    else if (o instanceof Double) isbn = o.toString();
    else if (o instanceof NodeList) {
        NodeList list = (NodeList) o;
        Node node = list.item(0);
        // getTextContent is available in <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> 5 and DOM 3.
        // In <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> 1.4 and DOM 2, you'd need to recursively 
        // accumulate the content.
        isbn= node.getTextContent();
    }
    else {
        throw new XPathFunctionException("Could not convert argument type");
    }

    char[] data = isbn.toCharArray();
    if (data.length != 10) return Boolean.FALSE;
    int checksum = 0;
    for (int i = 0; i &lt; 9; i++) {
        checksum += (i+1) * (data[i]-'0');
    }
    int checkdigit = checksum % 11;

    if (checkdigit + '0' == data[9] || (data[9] == 'X' &amp;&amp; checkdigit == 10)) {
        return Boolean.TRUE;
    }
    return Boolean.FALSE;

  }

}</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>下一步让这个扩展函数能够在 <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> 程序中使用。为此，需要在编译表达式之前向 XPath 对象安装 <code>javax.xml.xpath.XPathFunctionResolver</code>。函数求解器将函数的 XPath 名称和名称空间 URI 映射到实现该函数的 <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> 类。<a href="http://www-128.ibm.com/developerworks/cn/xml/x-javaxpathapi.html#listing9"><font color="#996699">清单 9</font></a> 是一个简单的函数求解器，将扩展函数 <code>valid-isbn</code> 和名称空间 http://www.example.org/books 映射到 <a href="http://www-128.ibm.com/developerworks/cn/xml/x-javaxpathapi.html#listing8"><font color="#996699">清单 8</font></a> 中的类。比如，XPath 表达式 <code>//book[not(pre:valid-isbn(isbn))]</code> 可以找到 ISBN 校验和不匹配的所有图书。 </p>
		<br />
		<a name="listing9">
				<b>清单 9. 识别 valid-isbn 扩展函数的上下文</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">iimport javax.xml.namespace.QName;
import javax.xml.xpath.*;

public class ISBNFunctionContext implements XPathFunctionResolver {

  private static final QName name 
   = new QName("http://www.example.org/books", "valid-isbn");

  public XPathFunction resolveFunction(QName name, int arity) {
      if (name.equals(ISBNFunctionContext.name) &amp;&amp; arity == 1) {
          return new ISBNValidator();
      }
      return null;
  }

}</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>由于扩展函数必须有名称空间，所以计算包含扩展函数的表达式时必须使用 <code>NamespaceResolver</code>，即便查询的文档没有使用任何名称空间。由于 <code>XPathFunctionResolver</code>、<code>XPathFunction</code> 和 <code>NamespaceResolver</code> 都是接口，如果方便的话可以将它们放在所有的类中。
</p>
		<hr />
		<p>
				<a name="N102B8">
						<span class="atitle">
								<font face="Arial" size="4">结束语</font>
						</span>
				</a>
		</p>
		<p>用 SQL 和 XPath 这样的声明性语言编写查询，要比使用 <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> 和 C 这样的命令式语言容易得多。但是，用 <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> 和 C 这样的图灵完整语言编写复杂的逻辑，又比 SQL 和 XPath 这样的声明性语言容易得多。所幸的是，通过使用 <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> Database Connectivity (JDBC) 和 <code>javax.xml.xpath</code> 之类的 API 可以将两者结合起来。随着世界上越来越多的数据转向 XML，<code>javax.xml.xpath</code> 将与 <code><a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.sql</code> 一样变得越来越重要。</p><img src ="http://www.blogjava.net/rain1102/aggbug/70267.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-09-18 13:34 <a href="http://www.blogjava.net/rain1102/archive/2006/09/18/70267.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XPath的语法</title><link>http://www.blogjava.net/rain1102/archive/2006/09/18/70209.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 18 Sep 2006 01:18:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/09/18/70209.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/70209.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/09/18/70209.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/70209.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/70209.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 当前位置		当我们使用XSLT处理XML源文档是，我们用Context来表示当前正在被模板处理的节点位置。比如xsl:template match="/"语句中表示Context在文档的根(root)节点。我不知道如何准确的翻译Context这个词，它类似于C语言里的指针，表示程序当前运行的位置。理解Context对于正确处理XSL模板非常重要，当您的XSL模板输出的文档和您想要的不一样，最先...&nbsp;&nbsp;<a href='http://www.blogjava.net/rain1102/archive/2006/09/18/70209.html'>阅读全文</a><img src ="http://www.blogjava.net/rain1102/aggbug/70209.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-09-18 09:18 <a href="http://www.blogjava.net/rain1102/archive/2006/09/18/70209.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>xsl过程解析</title><link>http://www.blogjava.net/rain1102/archive/2006/09/18/70207.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 18 Sep 2006 01:14:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/09/18/70207.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/70207.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/09/18/70207.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/70207.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/70207.html</trackback:ping><description><![CDATA[<p>&lt;?xml version="1.0" encoding="iso-8859-1"?&gt;</p>
		<p>这是标准的XML文档的首行代码，因为XSLT本身也是XML文档。<br />encoding属性用来定义文档使用的编码形式，iso-8859-1主要支持西欧和北美的语言编码。<br />如果你想使用简体中文，那么就应该写成：</p>
		<p>&lt;?xml version="1.0" encoding="GB2312"?&gt;</p>
		<p>接下去的代码是:</p>
		<p>&lt;xsl:stylesheet&#160; xmlns:xsl="<a href="http://www.w3.org/1999/XSL/Transform">http://www.w3.org/1999/XSL/Transform</a>"&#160; version="1.0"&gt;</p>
		<p>这是标准的XSLT文件首行代码。xsl:stylesheet代码的意思是将文档作为一个样式表来(stylesheet)处理。<br />xmlns:xsl属性是一个名字空间声明，和XML中的名字空间使用方法一样，用来防止元素名称重复和混乱。<br />其中前缀xsl的意思是文档中使用的元素遵守W3C的XSLT规范。<br />最后的version属性说明样式表只采用XSLT 1.0的标准功能，这也是目前仅有的标准。</p>
		<p>&lt;xsl:template match="/"&gt;</p>
		<p>一个&lt;xsl:template&gt;元素定义一个模板规则。属性match="/"说明XML源文档中，这个模板规则作用的起点。"/"是一种XPath语法，我们在后面将详细讲述，这里的"/"代表XML结构树的根(root)。</p>
		<p>接下去的代码是:</p>
		<p>&lt;html&gt;</p>
		<p>&lt;head&gt;</p>
		<p>&lt;title&gt;First XSLT Example&lt;/title&gt;</p>
		<p>&lt;/head&gt;</p>
		<p>&lt;body&gt;</p>
		<p>&lt;p&gt;&lt;xsl:value-of select="greeting"/&gt;&lt;/p&gt;</p>
		<p>&lt;/body&gt;</p>
		<p>&lt;/html&gt;</p>
		<p>说明：当模板规则被触发，模板的内容就会控制输出的结果。例子中，模板大部分内容由HTML元<br />素和文本构成。只有&lt;xsl:value-of&gt;元素是XSLT语法，这里&lt;xsl:value-of&gt;的作用是拷贝原文档中的<br />一个节点的值到输出文档。而select属性则详细指定要处理的节点名称。这是XPath语法，"greeting"<br />的意思就是寻找根节点名为greeting的元素，并用模板来处理这个节点。具体的就是找到&lt;greeting&gt;<br />元素，然后将元素的值"hello world"按模板样式拷贝到输出文件。 </p>
		<p>提示：由于XML文档是严格的层级结构(用IE5查看XML文件，会看见XML文档类似多级关联菜单)，<br />所以我们形象的称XML文档为文档树，其中每一对元素称作树的一个节点。根元素就是根节点。</p>
		<p>最后关闭所有元素：</p>
		<p>&lt;/xsl:template&gt;</p>
		<p>&lt;/xsl:stylesheet&gt;</p>
		<p>&#160;</p><img src ="http://www.blogjava.net/rain1102/aggbug/70207.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-09-18 09:14 <a href="http://www.blogjava.net/rain1102/archive/2006/09/18/70207.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML技巧五则</title><link>http://www.blogjava.net/rain1102/archive/2006/09/18/70202.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 18 Sep 2006 00:47:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/09/18/70202.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/70202.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/09/18/70202.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/70202.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/70202.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #0099cc 0.75pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: #0099cc 0.75pt solid; PADDING-LEFT: 4pt; BACKGROUND: #ddedfb; PADDING-BOTTOM: 4pt; BORDER-LEFT: #0099cc 0.75pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: #0099cc 0.75pt solid">
				<span lang="EN-US">
						<font size="2">
								<font face="宋体, MS Song">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%">
												<strong>
														<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">技巧</span>
												</strong>
												<strong>
														<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">1</span>
												</strong>
												<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">
														<br />
												</span>
												<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">　　</span>
												<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">XmlNode.InnerText</span>
												<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">与</span>
												<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">.InnerXml</span>
												<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">的区别是：前者将内容中的</span>
												<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">&lt;</span>
												<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">和</span>
												<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">&gt;</span>
												<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">分别变成</span>
												<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">&lt;</span>
												<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">和</span>
												<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">&gt;</span>
												<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">，因此，希望将两段</span>
												<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'"> XmlDocument </span>
												<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">合并的程序只能使用</span>
												<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">
														<span lang="EN-US">
																<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
																<o:p>
																</o:p>
														</span>
												</span>
										</p>
										<p class="code" style="MARGIN: 3.75pt">
												<br />XmlDocumentFragment.InnerXml = XmlNode.OuterXml<o:p></o:p></p>
								</font>
						</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">
						<br />
				</span>
				<strong>
						<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">技巧</span>
				</strong>
				<strong>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">2</span>
				</strong>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">
						<br />
						<o:p>
								<p class="code" style="MARGIN: 3.75pt">
										<span lang="EN-US">
												<font size="2">
														<font face="宋体, MS Song">/XPath: string end-with <br /><br />&lt;xsl:for-each select="root/data[substring-after(@name,'.')= 'Text' and string-length(value)&gt;0]"&gt;<o:p></o:p></font>
												</font>
										</span>
								</p>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">
										<br />
								</span>
								<strong>
										<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">技巧</span>
								</strong>
								<strong>
										<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">3</span>
								</strong>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">
										<br />
								</span>
								<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">　　一个</span>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">XML</span>
								<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">文档在</span>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">Load</span>
								<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">时如果失败，就是根本不合法；是否符合某个</span>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">Schema</span>
								<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">（</span>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">XSD</span>
								<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">）的要求则是有效性</span>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">(valid)</span>
								<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">检查，方法是使用</span>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">XmlValidatingReader</span>
								<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">对象的</span>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">Schemas</span>
								<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">和</span>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">ValidationType</span>
								<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">属性。</span>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">
										<br />
								</span>
								<strong>
										<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">技巧</span>
								</strong>
								<strong>
										<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">4</span>
								</strong>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">
										<br />
								</span>
								<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">　　</span>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">XmlDataDocument</span>
								<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">类是从</span>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">XmlDocument</span>
								<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">派生出来的，最重要的是增加了一个</span>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">DataSet</span>
								<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">属性。不过这个类不是</span>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">System.Xml</span>
								<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">提供的，而是</span>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">System.Data</span>
								<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">提供的。对于总是要跟数据库打交道的应用程序来说，反正是要引用</span>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">System.Data</span>
								<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">的，不如全部用</span>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">XmlDataDocument</span>
								<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">。</span>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">
										<br />
								</span>
								<strong>
										<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">技巧</span>
								</strong>
								<strong>
										<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">5</span>
								</strong>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">
										<br />
								</span>
								<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">　　如何将</span>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">XmlDataDocument</span>
								<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">对象中的</span>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">DataSet</span>
								<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">更新保存到数据库中？</span>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">DataSet</span>
								<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">本身有一个</span>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'">AcceptChanges</span>
								<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: '&#xB;'; mso-hansi-font-family: '&#xB;'">方法，所以只需要：<br /><br /><span lang="EN-US"><font size="2"><font face="宋体, MS Song">&#160;&#160;&#160; xmlDataDoc.DataSet.AcceptChanges();</font></font></span></span>
						</o:p>
				</span>
		</div>
		<p class="code" style="MARGIN: 3.75pt">
				<span lang="EN-US">
						<font size="2">
								<font face="宋体, MS Song">
										<o:p>
										</o:p>
								</font>
						</font>
				</span>&#160;</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">&#160;<o:p></o:p></span>
		</p><img src ="http://www.blogjava.net/rain1102/aggbug/70202.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-09-18 08:47 <a href="http://www.blogjava.net/rain1102/archive/2006/09/18/70202.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML文法分析</title><link>http://www.blogjava.net/rain1102/archive/2006/09/18/70200.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 18 Sep 2006 00:44:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/09/18/70200.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/70200.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/09/18/70200.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/70200.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/70200.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在进行						XML				文法分析之前，首先有必要了解						XML				语法的基本规则：词法特征：1）XML区分大小写，如元素名在打开和关闭标记中应保持大小写一致&lt;mytag&gt;&#8230;&lt;/mytag&gt;，XML的保留词串应符合大小写要求&lt;?xml &#8230;&gt; &lt;!ENTITY&gt;&#8230;。2...&nbsp;&nbsp;<a href='http://www.blogjava.net/rain1102/archive/2006/09/18/70200.html'>阅读全文</a><img src ="http://www.blogjava.net/rain1102/aggbug/70200.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-09-18 08:44 <a href="http://www.blogjava.net/rain1102/archive/2006/09/18/70200.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>