﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-灵魂-放水-随笔分类-XML</title><link>http://www.blogjava.net/zqli/category/10110.html</link><description>为学日益，为道日损。</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 10:23:19 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 10:23:19 GMT</pubDate><ttl>60</ttl><item><title>[转] 使用VTD-XML简化XML处理-克服DOM及SAX缺点的新选择</title><link>http://www.blogjava.net/zqli/archive/2006/08/29/66398.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Tue, 29 Aug 2006 05:20:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2006/08/29/66398.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/66398.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2006/08/29/66398.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/66398.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/66398.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<p>
						<span style="FONT-SIZE: 16px">作者:Jimmy Zhang;<a href="http://www.matrix.org.cn/user.shtml?username=rainy14f" target="_blank">rainy14f</a>(作者的blog:<a href="http://shaofan.blogjava.net/" target="_blank">http://shaofan.blogjava.net/</a>)</span>
				</p>
				<p>
						<strong>
								<span style="FONT-SIZE: 16px">概要</span>
								<br />
								<br />
						</strong>做为下一代WEB应用的推动性技术，XML相当简单，易学易用。然而，当前的XML处理技术却非如此。Document Object Model和Simple API for XML都比较慢，低效，且不易于使用。VTD-XML，作为下一代的XML处理模型，提供超越DOM和SAX的广泛用途和更佳选择，不仅可以简化XML编程，也使选择XML处理模型更加容易。这篇文章通过最近的基准测试数据和示例程序来突显它的关键性的技术优势，显示出VTD-XML将可能解决长期以来困扰企业架构的，在DOM和SAX之间进行抉择的问题。<br /><br />自从诞生以来的八年里，XML作为一个开放，半结构化的数据格式和WEB应用的数据交换工具，已取得了长足进步。由于它的简易性和良好的可读性，XML受到开发人员的热烈欢迎，并且已经成为了企业架构不可分割的一部分。<br /><br />虽然很难说清XML到底有多少种不同的应用，但至少有一点是肯定的：XML解析处理已成为各种工作的先决任务。实际上，决定使用哪种解析器也经常是企业开发者在项目中必须首先解决的问题之一。长久以来，这其实就是在两种 XML处理模型之间做出选择：Document Object Model (DOM) 和 Simple API for XML (SAX)。<br /><br />粗看之下，DOM和SAX各自的优缺点刚好形成互补。DOM使用内存保存对象结构；而SAX则基于事件并且不使用内存来存储任何数据。因此，DOM比较适合文档较小而数据访问模式复杂的情况，相反情况下，则使用SAX。<br /><br />然而事实却并不这么单纯。很多情况下，开发者不情愿使用复杂的SAX，但又不得不用，因为没有其他选择。此外，即使XML文件的大小只是稍微大于几百K，DOM的内存开销和性能迟滞也会成为棘手的障碍，使得程序无法达到项目所要求的最低性能目标。<br /><br />那么是否SAX的性能真得好得多？实际上，SAX所吹嘘的解析性能――通常比DOM快几倍――常常是不现实的。事实显示，SAX笨拙的，只能往前的解析不仅在使用时相当不便，而且当文档结构稍微复杂时，也会遇到性能问题。如果开发人员不想多次扫描文档，那么就需要对文档进行缓冲，或构建自己的对象模型。<br /><br />不管使用哪种方法，性能都会成为问题，正如Apache Axis所证明的那样。在Axis的FAQ页面，它声称使用了SAX来构建高性能的实现，但它仍然使用了他们自己的和DOM非常相像的对象模型。但与它的前任 (Apache SOAP) 相比，这种做法并没有带来明显的性能提升。而且，SAX无法处理XPath，一般来说也无法驱动XSLT (Extensible Stylesheet Language Transformation) 的处理。因此，SAX仍然无法真正解决XML处理中的问题。<br /><br />为了寻找一个更易用的SAX的取代方案，越来越多的开发人员开使转向StAX (Streaming API for XML)。与SAX相比，StAX使用从XML文件中提取标记的方法，而不是回调。这种方案显著地改善了可用性，但一个基本的问题仍然存在――StAX的只能往前的解析对于程序员依然不便，而且存在隐藏的性能损失。<br /><br />底线是：任何想得到广泛应用的XML处理模型，必需能够完整体现XML的层次结构。这是因为，XML是被设计为在WEB上传输复杂数据的，因此完整展现它的结构信息也是它的任务之一。</p>
				<p>
						<strong>
								<span style="FONT-SIZE: 16px">VTD-XML改变了游戏</span>
								<br />
								<br />
						</strong>假设我们要从头开始一个XML处理过程，并克服上面提到的DOM和SAX的种种缺点，那么这个新的模型应该具有以下属性：<br /><br />* 随机访问能力：处理模型应该允许开发人员方便访问文档的某种层次结构，比如，使用XPath，或手动。<br />* 高性能：性能上与DOM及SAX相比，应有显著提高，而且这个“性能”应该是真实的，就是说，应该把建立文档层次结构的时间也算上。<br />* 低内存占用率：要使该模型能够被广泛应用于各种场景，不管文件的大小，那它就必须能够以最低的内存消耗来表现XML的结构。<br /><br />VTD-XML就是一个实现了这些目标的下一代的开源XML处理模型。它相比于DOM和SAX有着本质和全面的改进。VTD-XML的一个关键优化是非提取符号(non-extractive tokenization)。在其内部，VTD-XML在内存中保存完整及未解码的XML消息，并使用一个二进制编码规范来唯一地表示每个符号。这种规范被称为Virtual Token Descriptor（虚拟符号描述符）。每个VTD记录都是一个64字节的整数，它对XML中符号的长度，起始偏移量，类型，嵌套深度进行了编码。<br /><br />再简单地介绍一下VTD-XML的历史，也许你会感兴趣：最初这个概念是被用来在特定硬件设备上使用，以使这些硬件（如路由器，交换机）可以高速处理XML，比如FPGA,ASIC。此后，VTD-XML项目组决定使它开源，并于2004年五月发布了VTD-XML的最初版本，0.5版，用JAVA实现。从那时起。VTD-XML经历了多次改进并越来越成熟。在0.8版本中，C语言版本的VTD-XML与JAVA版同时发布。在1.0版中引入了对XPath的内建支持，于2005年10月发布。最新的版本是1.5版，它的解析引擎被重新编写以实现更强的模块化和更高的性能。<br /><br />同样，在这个版本中还出现了一个新的特性，叫作缓冲重用。它的基本概念是，当XML应用需要通过网络连接来反复地读入XML文档时，该应用会重用在第一次处理中分配的内存缓冲。换句话说，即一次分配，多次使用。就VTD-XML来讲，这个特性完全消除了在处理XML过程中建立对象和垃圾回收的开销（在DOM和SAX中占用50%至80%的开销）。在该项目的网站上，提供有最新的软件下载和深层技术说明。<br /><br /><br /><strong><span style="FONT-SIZE: 16px">一个简短例子</span></strong><br /><br />为了使你更好地了解VTD-XML编程的风格，本文首先对用VTD-XML和DOM解析和访问一个简单的XML文件进行对比。该文件名为test.xml，内容如下：<br /></p>
				<pre class="overflow">&lt;purchaseOrder orderDate="1999-10-21"&gt;<br />       &lt;item partNum="872-AA"&gt;<br />         &lt;productName&gt;Lawnmower&lt;/productName&gt;<br />         &lt;quantity&gt;1&lt;/quantity&gt;<br />         &lt;USPrice&gt;148.95&lt;/USPrice&gt;<br />       &lt;/item&gt;<br />&lt;/purchaseOrder&gt;</pre>
				<p>
						<br />
						<br />VTD-XML版本的程序如下：<br /></p>
				<pre class="overflow">import com.ximpleware.*;<br />import com.ximpleware.parser.*;<br />import java.io.*;<br /><br />public class use_vtd {<br />    public static void main(String[] args){<br />        try{<br />            File f = new File("test.xml");<br />            FileInputStream fis = new FileInputStream(f);<br />            byte[] ba = new byte[(int)f.length()];<br />            fis.read(ba);<br />            VTDGen vg = new VTDGen();<br />            vg.setDoc(ba);<br />            vg.parse(false);<br />            VTDNav vn = vg.getNav();<br />            if (vn.matchElement("purchaseOrder")){<br />                System.out.println(" orderDate==&gt;" <br />                    + vn.toString(vn.getAttrVal("orderDate")));<br />                if (vn.toElement(VTDNav.FIRST_CHILD,"item")){<br />                    if (vn.toElement(VTDNav.FIRST_CHILD)){<br />                        do {<br />                            System.out.print( vn.toString(vn.getCurrentIndex()));<br />                                System.out.print("==&gt;");<br /><br />                            System.out.println( vn.toString(vn.getText()));<br />                        } while(vn.toElement(VTDNav.NEXT_SIBLING));<br />                    }<br />                }<br />            }<br />        }<br />        catch (Exception e){<br />            System.out.println("exception occurred ==&gt;"+e);<br />        } <br />    }<br />}</pre>
				<p>
						<br />
						<br />实现同样功能的DOM版本的程序：<br /></p>
				<pre class="overflow">import java.io.*;<br />import org.w3c.dom.*;<br />import org.w3c.*;<br />import javax.xml.parsers.*;<br />import javax.xml.parsers.DocumentBuilder;<br />import javax.xml.parsers.DocumentBuilderFactory;<br />import javax.xml.parsers.FactoryConfigurationError;<br />import javax.xml.parsers.ParserConfigurationException;<br />import org.w3c.dom.*;<br />import org.xml.sax.SAXException;<br /><br />public class use_dom {<br />    public static void main(String[] args){<br />        try{<br />            DocumentBuilderFactory factory =<br />            DocumentBuilderFactory.newInstance();<br />            DocumentBuilder parser = factory.newDocumentBuilder();<br />            Document d= parser.parse("test.xml");<br />            Element root = d.getDocumentElement();<br />            if (root.getNodeName().compareTo("purchaseOrder")==0){<br />                System.out.println(" orderDate==&gt; "<br />                    + root.getAttribute("orderDate"));<br /><br />                Node n = root.getFirstChild();<br />                if (n != null){<br />                    do {<br />                        if (n.getNodeType() == Node.ELEMENT_NODE<br />                            &amp;&amp; n.getNodeName().compareTo("item")==0){<br />                            Node n2 = n.getFirstChild();<br />                            if (n2!=null){<br />                                do {<br />                                    if (n2.getNodeType()<br />                                        == Node.ELEMENT_NODE){    <br />                                        System.out.println( <br />                                            n2.getNodeName() <br />                                            + "==&gt;" +<br />                                            n2.getFirstChild().getNodeValue()<br />                                        );<br />                                    }<br />                                }while((n2=n2.getNextSibling())!=null);<br />                            } <br />                        }<br />                    }while ((n=n.getNextSibling()) != null ); <br />                } <br />            } <br />        }<br />        catch (Exception e){<br />            System.out.println("exception occurred ==&gt;"+e);<br />        }    <br />    }<br />}</pre>
				<p>
						<br />
						<br />像以上所展示的那样，VTD-XML使用基于游标的API来访问XML层次结构。相比之下，DOM API通过请求对象的引用来达成同样目标。VTD-XML的项目网站提供更多详细的技术资料和示例程序。<br /><br /><strong><span style="FONT-SIZE: 16px">VTD-XML的基准测试</span></strong><br /><br />下面，我们来比较一下VTD-XML一些流行的XML解析器的性能和内存占用情况。值得注意的是，多数包含基准测试数据的文章，如Dennis Sosnoski于2002年4月发表在JavaWorld上的“XML Documents on the Run”，都是多年前的文章。自那以后，如摩尔定律所示，更好更快的硬件大量涌现并越来越便宜。同时，XML解析与JVM技术也并未止步不前――在一些关键领域做出了改进。<br /><br /><strong>测试设置</strong><br />测试平台是Sony VAIO笔记本电脑，使用Pentium M 1.7 GHz处理器（2MB L2 cache），512MB DDR2内存。前端总线频率为400MHz。操作系统为Windows XP Professional Edition with Services pack 2。JVM版本为1.5.0_06。<br />对以下XML解析器的最新版本进行了基准测试：<br />*Xerces DOM 2.7.1, 带有及不带有延迟节点扩展(deferred node expansion)<br />*Xerces SAX 2.7.1<br />*Piccolo SAX 1.04<br />*XPP3 1.1.3.4.O<br />*VTD-XML 1.5, 带有及不带有缓冲重用<br /><br />在测试中我使用了大量不同大小和不同复杂程度的XML文档。从文档大小上，我把它们分为三类：小文件（小于10KB）；中文件（10KB至1MB）；大文件（大于1MB）。<br />在全部的性能度量中我都使用了服务器的JVM来获取最高性能。在这些测试中，基准测试程序首先会多次解析或访问文档，使JVM对字节码进行即时动态优化，之后才取得性能的平均值作为最终结果。为了减少由于磁盘IO导致的时间差别，基准测试程序在测试运行之前已经把XML文件读入到内存中。<br /><br /><span style="COLOR: red">注意</span>：有兴趣的读者可以从资源下载基准测试程序。<br /><br /><strong>吞吐量对比解析</strong><br />本节在延迟时间和吞吐量上对XML解析性能进行描述。要注意的是VTD-XML与DOM可直接进行比较，而与SAX或Pull直接对比就很不公平，因为它们不在内存中构建任何层次结构。因此SAX和Pull的性能在此只作为额外参考。<br />吞吐量<br /><br /><img onmouseover="javascript:imgShowTip(this);" style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://www.matrix.org.cn/resource/upload/forum/2006_07_13_205701_cYMnkAWCmw.gif" onload="javascript:imgLoad(this);" border="0" /><br />图 1. 小文件. <br />     <br /><img onmouseover="javascript:imgShowTip(this);" style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://www.matrix.org.cn/resource/upload/forum/2006_07_13_205712_qNnVyeULFp.gif" onload="javascript:imgLoad(this);" border="0" /><br />图 2. 中文件. <br />     <br /><img onmouseover="javascript:imgShowTip(this);" style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://www.matrix.org.cn/resource/upload/forum/2006_07_13_205721_PtLjAtZhrc.gif" onload="javascript:imgLoad(this);" border="0" /><br />图 3. 大文件. <br /><br /><strong>延迟时间对比</strong><br />表 1. 小文件<br /><img onmouseover="javascript:imgShowTip(this);" style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://www.matrix.org.cn/resource/upload/forum/2006_07_13_205756_ZmxlOwRhBY.jpg" onload="javascript:imgLoad(this);" border="0" /><br /><br />表 2. 中文件<br /><img onmouseover="javascript:imgShowTip(this);" style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://www.matrix.org.cn/resource/upload/forum/2006_07_13_205837_nbSMKVugll.jpg" onload="javascript:imgLoad(this);" border="0" /><br /><br />表 3. 大文件<br /><img onmouseover="javascript:imgShowTip(this);" style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://www.matrix.org.cn/resource/upload/forum/2006_07_13_205923_kUbxFhEhxA.jpg" onload="javascript:imgLoad(this);" border="0" /><br /><br />内存占用率对比<br />因为SAX和Pull不在内存中构建任何数据结构，所以这项测试只有与DOM的对比才有意义。因此，本节对倍加系数(multiplying factor)进行衡量，该系数为内存占用率与大文件的文件大小之比（内存占用对大文件特别重要）。<br /><br /><img onmouseover="javascript:imgShowTip(this);" style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://www.matrix.org.cn/resource/upload/forum/2006_07_13_205747_nEXwGytyOH.gif" onload="javascript:imgLoad(this);" border="0" /><br />图 4. <br /><br /><strong>访问性能对比</strong><br />本节从延迟时间上展示VTD-XML与DOM 的访问性能。延迟时间是指访问文档中每个节点所花的时间。为了遍历所有节点，DOM依赖于nodeInterator接口，而VTD-XML则调用AutoPilot类的成员方法selectElement(…)与iterate(…)。如所预期的一样，访问速度比解析速度要快得多。对VTD-XML，访问时间开销在解析时间开销的15%到30%之间。对DOM，该数字为5%到7%。这并不说明VTD-XML的访问速度慢于DOM。这完全是因为VTD-XML有着非常快的解析速度。<br /><br />表 4. 小文件<br /><img onmouseover="javascript:imgShowTip(this);" style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://www.matrix.org.cn/resource/upload/forum/2006_07_13_205940_MqbqEtuWTE.jpg" onload="javascript:imgLoad(this);" border="0" /><br /><br />表 5. 中文件<br /><img onmouseover="javascript:imgShowTip(this);" style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://www.matrix.org.cn/resource/upload/forum/2006_07_13_205947_lceZZiRzhd.jpg" onload="javascript:imgLoad(this);" border="0" /><br /><br />表 6. 大文件<br /><img onmouseover="javascript:imgShowTip(this);" style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://www.matrix.org.cn/resource/upload/forum/2006_07_13_205955_OCsqpDNuJO.jpg" onload="javascript:imgLoad(this);" border="0" /><br /><br /><strong>结果分析</strong><br />在Dennis Sosnoski四年前发表于JavaWorld的文章中，Piccolo是众多SAX实现中的赢家。现在这得到了改变：最新的Xerces击败众多对手成为性能最好的SAX解析器。测试结果也显示，与Xerces相比，XPP3也有相当不错的性能，不比前者相差很多。<br />另外，有趣的是，当文件较小时，DOM与SAX的解析性能差距并不像在解析大文件时的相差那么大。在小文件的情况下，DOM的延迟节点扩展导致比使用完全节点扩展要差的解析性能。<br /><br />而VTD-XML的出众性能使它完全胜过其他任何解析器，这使它自成一级。真正的比较只是存在于使用缓冲重用的VTD-XML及不使用缓冲重用的VTD-XML之间。内存占用率上的重大优势使得VTD-XML可以被用于处理大XML文档，并且对任意大小的文件都有较好的性能。<br /><br /><strong><span style="FONT-SIZE: 16px">结论</span></strong><br /><br />VTD-XML是一种全新的，下一代的XML解析器。它解决了许多目前困扰DOM和SAX的问题。VTD-XML高性能与低内存占用的结合意味着：首先，DRAM已经相当便宜，如果不是完全没有空间存放XML文档，那就没有多少理由使用SAX；其次，使用VTD-XML使得应用变得更加简单，更快。它对各种大小的文件的适应性，使得选择一个合适的XML处理模型变得简单，而开发人员也不必再在完全不同的DOM和SAX中进行切换了；最后，VTD-XML可以为长久以来对XML的不满提供一个令人信服的答案。比如，VTD-XML内建了本地XML索引的能力，也许可以永久改变认为XML速度慢的看法。正由于它的性能优势，VTD-XML应该标志着“10倍速XML”时代的到来。更重要的是，VTD-XML的下一站，只在咫尺之遥，那就是“100倍速XML”。</p>
				<p>
						<strong>资源</strong>
						<br />*VTD-XML:<a href="http://vtd-xml.sf.net/" target="_blank">http://vtd-xml.sf.net/</a><br />*Apache Axis FAQ:<a href="http://ws.apache.org/axis/faq.html#faq1" target="_blank">http://ws.apache.org/axis/faq.html#faq1</a><br />*下载基准测试程序:<a href="http://sourceforge.net/project/showfiles.php?group_id=110612" target="_blank">http://sourceforge.net/project/showfiles.php?group_id=110612</a><br /></p>
				<br />
				<br />
				<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=933706</p>
		</div>
<img src ="http://www.blogjava.net/zqli/aggbug/66398.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2006-08-29 13:20 <a href="http://www.blogjava.net/zqli/archive/2006/08/29/66398.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>删除同名节点手记</title><link>http://www.blogjava.net/zqli/archive/2006/05/25/48090.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Thu, 25 May 2006 10:22:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2006/05/25/48090.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/48090.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2006/05/25/48090.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/48090.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/48090.html</trackback:ping><description><![CDATA[
		<p> 程序代码片-类方法：用到jdom包<br />public void removeElement(String path,String catalog){<br />      <em> </em>SAXBuilder sb = new SAXBuilder();<br />   try<br />      {        <br />       Document doc = sb.build(path);<br />       Element root = doc.getRootElement();<br />       Element subroot=root.getChild("entity");<br />       <br />       Element content=subroot.getChild("contents");<br />      <br />      List entities=content.getChildren("entity");<br />      for(int j=0;j&lt;entities.size();j++)<br />      {<br />       Element _element=(Element)entities.get(j);<br />       if(_element.getChild("nick").getText().equals(catalog))<br />       {<br />        System.out.println(_element.getChild("nick").getText());<br />        System.out.println(_element.getChild("description").getText());<br />           <font color="#ff1493">content.removeContent(_element);<br /></font>          <font color="#ffa500"> //_element.removeContent(_element);</font><br />           }<br />      }<br />       <br />         Format format = Format.getCompactFormat();</p>
		<p>         format.setEncoding("UTF-8"); <em>//设置xml文件的字符为UTF-8<br /></em>         format.setIndent("    "); <em>//设置xml文件的缩进为4个空格</em></p>
		<p>         XMLOutputter xmlOutput = new XMLOutputter(format);<br />         xmlOutput.output(root, new FileOutputStream(path));<br />      }<br />    catch(Exception e)<br />    {<br />          e.printStackTrace();<br />    }<br />     }<br />XML文件片：<br /> &lt;entity&gt;<br />        &lt;description&gt;文档目录管理&lt;/description&gt;<br />        &lt;imageBase&gt;images/globe.gif&lt;/imageBase&gt;<br />        &lt;imageOpen&gt;images/globe_selected.gif&lt;/imageOpen&gt;<br />        &lt;contents&gt;<br />            &lt;entity&gt;<br />                &lt;nick&gt;1&lt;/nick&gt;<br />                &lt;description&gt;档案管理程序&lt;/description&gt;<br />                &lt;imageBase&gt;images/book.gif&lt;/imageBase&gt;<br />                &lt;imageOpen&gt;images/bookOpen.gif&lt;/imageOpen&gt;<br />                &lt;contents&gt;<br />                    &lt;entity&gt;<br />                        &lt;nick&gt;1&lt;/nick&gt;<br />                        &lt;description&gt;国家Linux技术培训与推广中心档案查询登记表&lt;/description&gt;<br />                        &lt;imageBase&gt;images/paper.gif&lt;/imageBase&gt;<br />                        &lt;imageOpen&gt;images/paper.gif&lt;/imageOpen&gt;<br />                        &lt;title&gt;国家Linux技术培训与推广中心档案查询登记表&lt;/title&gt;<br />                        &lt;dir&gt;doc/1/1.doc&lt;/dir&gt;<br />                    &lt;/entity&gt;<br />                    &lt;entity&gt;<br />                        &lt;nick&gt;2&lt;/nick&gt;<br />                        &lt;description&gt;国家Linux技术培训与推广中心档案管理程序&lt;/description&gt;<br />                        &lt;imageBase&gt;images/paper.gif&lt;/imageBase&gt;<br />                        &lt;imageOpen&gt;images/paper.gif&lt;/imageOpen&gt;<br />                        &lt;title&gt;国家Linux技术培训与推广中心档案管理程序&lt;/title&gt;<br />                        &lt;dir&gt;doc/1/2.doc&lt;/dir&gt;<br />                    &lt;/entity&gt;<br />                    &lt;entity&gt;<br />                        &lt;nick&gt;3&lt;/nick&gt;<br />                        &lt;description&gt;lnic人员管理办法&lt;/description&gt;<br />                        &lt;imageBase&gt;images/paper.gif&lt;/imageBase&gt;<br />                        &lt;imageOpen&gt;images/paper.gif&lt;/imageOpen&gt;<br />                        &lt;title&gt;lnic人员管理办法&lt;/title&gt;<br />                        &lt;dir&gt;doc/1/3.txt&lt;/dir&gt;<br />                    &lt;/entity&gt;<br />                &lt;/contents&gt;<br />            &lt;/entity&gt;<br />            &lt;entity&gt;<br />                &lt;nick&gt;2&lt;/nick&gt;<br />                &lt;description&gt;对外业务&lt;/description&gt;<br />                &lt;imageBase&gt;images/book.gif&lt;/imageBase&gt;<br />                &lt;imageOpen&gt;images/bookOpen.gif&lt;/imageOpen&gt;<br />                &lt;contents&gt;<br />                    &lt;entity&gt;<br />                        &lt;nick&gt;1&lt;/nick&gt;<br />                        &lt;description&gt;国家Linux技术培训与推广中心供应商调查报告&lt;/description&gt;<br />                        &lt;imageBase&gt;images/paper.gif&lt;/imageBase&gt;<br />                        &lt;imageOpen&gt;images/paper.gif&lt;/imageOpen&gt;<br />                        &lt;title&gt;国家Linux技术培训与推广中心供应商调查报告&lt;/title&gt;<br />                        &lt;dir&gt;doc/2/1.doc&lt;/dir&gt;<br />                    &lt;/entity&gt;<br />                    &lt;entity&gt;<br />                        &lt;nick&gt;2&lt;/nick&gt;<br />                        &lt;description&gt;国家Linux技术培训与推广中心国有资产申购单&lt;/description&gt;<br />                        &lt;imageBase&gt;images/paper.gif&lt;/imageBase&gt;<br />                        &lt;imageOpen&gt;images/paper.gif&lt;/imageOpen&gt;<br />                        &lt;title&gt;国家Linux技术培训与推广中心国有资产申购单&lt;/title&gt;<br />                        &lt;dir&gt;doc/2/2.doc&lt;/dir&gt;<br />                    &lt;/entity&gt;<br />                    &lt;entity&gt;<br />                        &lt;nick&gt;3&lt;/nick&gt;<br />                        &lt;description&gt;国家Linux技术培训与推广中心合格供应商名录&lt;/description&gt;<br />                        &lt;imageBase&gt;images/paper.gif&lt;/imageBase&gt;<br />                        &lt;imageOpen&gt;images/paper.gif&lt;/imageOpen&gt;<br />                        &lt;title&gt;国家Linux技术培训与推广中心合格供应商名录&lt;/title&gt;<br />                        &lt;dir&gt;doc/2/3.doc&lt;/dir&gt;<br />                    &lt;/entity&gt;<br />                    &lt;entity&gt;<br />                        &lt;nick&gt;4&lt;/nick&gt;<br />                        &lt;description&gt;国家Linux技术培训与推广中心进货质量验收计划&lt;/description&gt;<br />                        &lt;imageBase&gt;images/paper.gif&lt;/imageBase&gt;<br />                        &lt;imageOpen&gt;images/paper.gif&lt;/imageOpen&gt;<br />                        &lt;title&gt;国家Linux技术培训与推广中心进货质量验收计划&lt;/title&gt;<br />                        &lt;dir&gt;doc/2/4.doc&lt;/dir&gt;<br />                    &lt;/entity&gt;<br />                    &lt;entity&gt;<br />                        &lt;nick&gt;5&lt;/nick&gt;<br />                        &lt;description&gt;国家Linux技术培训与推广中心培训协议书&lt;/description&gt;<br />                        &lt;imageBase&gt;images/paper.gif&lt;/imageBase&gt;<br />                        &lt;imageOpen&gt;images/paper.gif&lt;/imageOpen&gt;<br />                        &lt;title&gt;国家Linux技术培训与推广中心培训协议书&lt;/title&gt;<br />                        &lt;dir&gt;doc/2/5.doc&lt;/dir&gt;<br />                    &lt;/entity&gt;<br />                    &lt;entity&gt;<br />                        &lt;nick&gt;6&lt;/nick&gt;<br />                        &lt;description&gt;国家Linux技术培训与推广中心外购物品验收报告&lt;/description&gt;<br />                        &lt;imageBase&gt;images/paper.gif&lt;/imageBase&gt;<br />                        &lt;imageOpen&gt;images/paper.gif&lt;/imageOpen&gt;<br />                        &lt;title&gt;国家Linux技术培训与推广中心外购物品验收报告&lt;/title&gt;<br />                        &lt;dir&gt;doc/2/6.doc&lt;/dir&gt;<br />                    &lt;/entity&gt;<br />                    &lt;entity&gt;<br />                        &lt;nick&gt;7&lt;/nick&gt;<br />                        &lt;description&gt;lnic人员器材管理办法&lt;/description&gt;<br />                        &lt;imageBase&gt;images/paper.gif&lt;/imageBase&gt;<br />                        &lt;imageOpen&gt;images/paper.gif&lt;/imageOpen&gt;<br />                        &lt;title&gt;lnic人员器材管理办法&lt;/title&gt;<br />                        &lt;dir&gt;doc/2/7.doc&lt;/dir&gt;<br />                    &lt;/entity&gt;<br />                &lt;/contents&gt;<br />            &lt;/entity&gt;<br />        错误出现在： 1、<font color="#ff1493">content.removeContent(_element);<br /></font>          2、<font color="#ffa500"> //_element.removeContent(_element);</font></p>
		<p>
				<font color="#000000">用第2种方法总达不到效果，搞了半天才更正了错误。</font>
		</p>
<img src ="http://www.blogjava.net/zqli/aggbug/48090.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2006-05-25 18:22 <a href="http://www.blogjava.net/zqli/archive/2006/05/25/48090.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]xml+xsl应用,包含中文字符的URL编码问题</title><link>http://www.blogjava.net/zqli/archive/2006/04/27/43676.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Thu, 27 Apr 2006 15:18:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2006/04/27/43676.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/43676.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2006/04/27/43676.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/43676.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/43676.html</trackback:ping><description><![CDATA[
		<p>在xml应用中，经常将一些URL信息作为xml数据存储，其中URL参数有可能包含有中文字符。<br />当使用dom对xml数据进行解析时，可以对中文字符进行编码。<br />但如果只使用xslt来显示xml数据时(data.xml+data.xsl)，发现此时的URL会出现编码错误.<br />即使指定编码类型(encoding=gb2312),依然会出现同样的问题.<br />测试发现：是IE的缓存机制问题，IE仍会把新的页面(所链接的URL)的MIME内容类型默认为text/xml</p>
		<p>解决方法：<br />1.指定输出文档类型为xml文档  (example:data.xsl)<br /> &lt;xsl:output method=xml  encoding=gb2312 media-type=text/xml /&gt;<br />2.在新的窗口打开，给联接增加属性,指明目标窗口为其他窗口  (example:data2.xsl)<br /> &lt;xsl:attribute name=target&gt;_blank&lt;/xsl:attribute&gt;</p>
		<p>
				<br />examples:</p>
		<p>
				<br />/*** data.xml ***/</p>
		<p>&lt;?xml version=1.0 encoding=gb2312?&gt;<br />&lt;?xml-stylesheet type=text/xsl href=data.xsl?&gt;<br />&lt;root&gt;<br /> &lt;search&gt;<br />  &lt;url&gt;http://www.google.com/search?q=&lt;/url&gt;<br />  &lt;word&gt;xml数据&lt;/word&gt;<br /> &lt;/search&gt;<br /> &lt;search&gt;<br />  &lt;url&gt;http://www1.baidu.com/baidu?word=&lt;/url&gt;<br />  &lt;word&gt;xml数据&lt;/word&gt;<br /> &lt;/search&gt;<br /> &lt;search&gt;<br />  &lt;url&gt;http://www.google.com/search?q=&lt;/url&gt;<br />  &lt;word&gt;极限编程(xp)&lt;/word&gt;<br /> &lt;/search&gt;<br /> &lt;search&gt;<br />  &lt;url&gt;http://www1.baidu.com/baidu?word=&lt;/url&gt;<br />  &lt;word&gt;极限编程(xp)&lt;/word&gt;<br /> &lt;/search&gt;<br />&lt;/root&gt;</p>
		<p>
				<br />/*** data.xsl ***/</p>
		<p>&lt;?xml version=1.0 encoding=gb2312?&gt;<br />&lt;xsl:stylesheet version=1.0 xmlns:xsl=<a href="http://www.w3.org/1999/XSL/Transform"><font color="#000000">http://www.w3.org/1999/XSL/Transform</font></a>&gt;<br />&lt;!-- 去掉下面一句,将出现错误 --&gt;<br />&lt;xsl:output method=xml  encoding=gb2312 media-type=text/xml /&gt;</p>
		<p>&lt;xsl:template match=/&gt;<br /> &lt;xsl:apply-templates /&gt;  <br />&lt;/xsl:template&gt;</p>
		<p>&lt;xsl:template match=search&gt;<br /> &lt;xsl:element name=a&gt;<br />  &lt;xsl:attribute name=href&gt;&lt;xsl:value-of select=url /&gt;&lt;xsl:value-of select=word /&gt;&lt;/xsl:attribute&gt;<br />  &lt;xsl:value-of select=word /&gt;<br /> &lt;/xsl:element&gt;<br /> &lt;br /&gt;<br />&lt;/xsl:template&gt;</p>
		<p>&lt;/xsl:stylesheet&gt;</p>
		<p>
				<br />/*** data2.xsl ***/</p>
		<p>&lt;?xml version=1.0 encoding=gb2312?&gt;<br />&lt;xsl:stylesheet version=1.0 xmlns:xsl=<a href="http://www.w3.org/1999/XSL/Transform"><font color="#000000">http://www.w3.org/1999/XSL/Transform</font></a>&gt;</p>
		<p>&lt;xsl:template match=/&gt;<br /> &lt;xsl:apply-templates /&gt;  <br />&lt;/xsl:template&gt;</p>
		<p>&lt;xsl:template match=search&gt;<br /> &lt;xsl:element name=a&gt;<br />  &lt;xsl:attribute name=href&gt;&lt;xsl:value-of select=url /&gt;&lt;xsl:value-of select=word /&gt;&lt;/xsl:attribute&gt;<br />  &lt;!-- 去掉下面一句,将出现错误 --&gt;<br />  &lt;xsl:attribute name=target&gt;_blank&lt;/xsl:attribute&gt;<br />  &lt;xsl:value-of select=word /&gt;<br /> &lt;/xsl:element&gt;<br /> &lt;br /&gt;<br />&lt;/xsl:template&gt;</p>
		<p>&lt;/xsl:stylesheet&gt;</p>
<img src ="http://www.blogjava.net/zqli/aggbug/43676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2006-04-27 23:18 <a href="http://www.blogjava.net/zqli/archive/2006/04/27/43676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]XSLT与XML的属性</title><link>http://www.blogjava.net/zqli/archive/2006/04/17/41396.html</link><dc:creator>放水老倌</dc:creator><author>放水老倌</author><pubDate>Sun, 16 Apr 2006 16:14:00 GMT</pubDate><guid>http://www.blogjava.net/zqli/archive/2006/04/17/41396.html</guid><wfw:comment>http://www.blogjava.net/zqli/comments/41396.html</wfw:comment><comments>http://www.blogjava.net/zqli/archive/2006/04/17/41396.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqli/comments/commentRss/41396.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqli/services/trackbacks/41396.html</trackback:ping><description><![CDATA[        XSL 将属性视为属于XML 文件中的一个元素，好像是XML 文件中的子元素。然而，要在XSL样本中读取属性，你必须在属性名称前加上字符@，作为属性名称与元素名称的识别。<br />       例如，在下列起始标签中的筛选运算子从所有BOOK 元素，筛选出属性InStock 的属性值为「yes」的BOOK 元素。换句话说，筛选运算子筛选出有库存的书籍：<br />              &lt;xsl:for-each select="INVENTORY/BOOK [@InStock=yes]"&gt;<br />       你可以使用XSL 元素value-of，如同使用它来撷取元素的文字内容的方式一般，来撷取任何属性的属性值。例如下列所示，value-of 元素得到AUTHOR 元素中Born 属性的属性值：              <br />              &lt;xsl:value-of select="AUTHOR/@Born"/&gt;<br /><br />       在列表10-8 中的样式表，示范了存取XML 文件中元素属性值的技巧。这份样式表被连结到列表10-9 中的XML文件，并显示书籍清单中所有库存有的书籍。（你可以在随书光盘的 XslDemo06.xsl 和 XslDemo06.xml 档案中找到。） <br />              XslDemo06.xsl<br />              &lt;?xml version="1.0"?&gt;<br />              &lt;!--File Name:XslDemo06.xsl --&gt;<br />              &lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"&gt;<br />              &lt;xsl:template match="/"&gt;<br />              &lt;H2&gt;Books In Stock&lt;/H2&gt;<br />              &lt;TABLE BORDER="1" CELLPADDING="5"&gt;<br />              &lt;THEAD&gt;<br />              &lt;TH&gt;Title&lt;/TH&gt;<br />              &lt;TH&gt;Author&lt;/TH&gt;<br />              &lt;TH&gt;Binding Type&lt;/TH&gt;<br />              &lt;TH&gt;Number of Pages&lt;/TH&gt;<br />              &lt;TH&gt;Price&lt;/TH&gt;<br />              &lt;/THEAD&gt;<br />              &lt;xsl:for-each select="INVENTORY/BOOK<br />              [@InStock=yes]"&gt;<br />              &lt;TR ALIGN="CENTER"&gt;<br />              &lt;TD&gt;<br />              &lt;xsl:value-of<br />              select="TITLE"/&gt;<br />              &lt;/TD&gt;<br />              &lt;TD&gt;<br />              &lt;xsl:value-of<br />              select="AUTHOR"/&gt;&lt;BR/&gt;<br />              (born &lt;xsl:value-of<br />              select="AUTHOR/@Born"/&gt;)<br />              &lt;/TD&gt;<br />              &lt;TD&gt;<br />              &lt;xsl:value-of<br />              select="BINDING"/&gt;<br />              &lt;/TD&gt;<br />              &lt;TD&gt;<br />              &lt;xsl:value-of<br />              select="PAGES"/&gt;<br />              &lt;/TD&gt;<br />              &lt;TD&gt;<br />              &lt;xsl:value-of<br />              select="PRICE"/&gt;<br />              &lt;/TD&gt;<br />              &lt;/TR&gt;<br />              &lt;/xsl:for-each&gt;<br />              &lt;/TABLE&gt;<br />              &lt;/xsl:template&gt;<br />              &lt;/xsl:stylesheet&gt;<br />              <br />              XslDemo06.xml<br />              &lt;?xml version="1.0"?&gt;<br />              &lt;!--File Name:XslDemo06.xml--&gt;<br />              &lt;?xml-stylesheet type="text/xsl" href="XslDemo06.xsl"?&gt;<br />              &lt;INVENTORY&gt;<br />              &lt;BOOK InStock="yes"&gt;<br />              &lt;TITLE&gt;The Adventures of Huckleberry Finn&lt;/TITLE&gt;<br />              &lt;AUTHOR Born="1835"&gt;Mark Twain&lt;/AUTHOR&gt;<br />              &lt;BINDING&gt;mass market paperback&lt;/BINDING&gt;<br />              &lt;PAGES&gt;298&lt;/PAGES&gt;<br />              &lt;PRICE&gt;$5.49&lt;/PRICE&gt;<br />              &lt;/BOOK&gt;<br />              &lt;BOOK InStock="no"&gt;<br />              &lt;TITLE&gt;Leaves of Grass&lt;/TITLE&gt;<br />              &lt;AUTHOR Born="1819"&gt;Walt Whitman&lt;/AUTHOR&gt;<br />              &lt;BINDING&gt;hardcover&lt;/BINDING&gt;<br />              &lt;PAGES&gt;462&lt;/PAGES&gt;<br />              &lt;PRICE&gt;$7.75&lt;/PRICE&gt;<br />              &lt;/BOOK&gt;<br />              &lt;BOOK InStock="yes"&gt;<br />              &lt;TITLE&gt;The Marble Faun&lt;/TITLE&gt;<br />              &lt;AUTHOR Born="1804"&gt;Nathaniel Hawthorne&lt;/AUTHOR&gt;<br />              &lt;BINDING&gt;trade paperback&lt;/BINDING&gt;<br />              &lt;PAGES&gt;473&lt;/PAGES&gt;<br />              &lt;PRICE&gt;$10.95&lt;/PRICE&gt;<br />              &lt;/BOOK&gt;<br />              &lt;BOOK InStock="yes"&gt;<br />              &lt;TITLE&gt;Moby-Dick&lt;/TITLE&gt;<br />              &lt;AUTHOR Born="1819"&gt;Herman Melville&lt;/AUTHOR&gt;<br />              &lt;BINDING&gt;hardcover&lt;/BINDING&gt;<br />              &lt;PAGES&gt;724&lt;/PAGES&gt;<br />              &lt;PRICE&gt;$9.95&lt;/PRICE&gt;<br />              &lt;/BOOK&gt;<br />              &lt;/INVENTORY&gt;<br />        在XML 文件中的每个BOOK 元素，皆包含InStock 属性，藉由设定属性值为「yes」或「no」 来指定此书籍是否有库存。每个AUTHOR 元素使用Born 属性来指出作者的出生年份。              <br />        样式表使用筛选运算子中的属性，来从样式表所显示的BOOK 元素集合中排除所有缺货的书籍，而不是显示属性InStock 的属性值：<br />&lt;xsl:for-each select="INVENTORY/BOOK [@InStock=yes]"&gt;<br />&lt;!--display each BOOK element--&gt;<br />&lt;/xsl:for-each&gt;<br />        此样式表将BOOK 元素显示于HTML 的表格中，而不是在先前范例的SPAN 元素中。它利用XSL 元素value-of 将Born 属性的属性值显示于AUTHOR 元素的值之后。下列的元素会建立显示这些属性值的表格：<br />&lt;TD&gt;<br />&lt;xsl:value-of select="AUTHOR"/&gt;&lt;BR/&gt;<br />(born &lt;xsl:value-of select="AUTHOR/@Born"/&gt;)<br />&lt;/TD&gt;<br /><img src ="http://www.blogjava.net/zqli/aggbug/41396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqli/" target="_blank">放水老倌</a> 2006-04-17 00:14 <a href="http://www.blogjava.net/zqli/archive/2006/04/17/41396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>