﻿<?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-semovy-文章分类-XML相关</title><link>http://www.blogjava.net/WshmAndLily/category/22815.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 23 Aug 2007 06:00:28 GMT</lastBuildDate><pubDate>Thu, 23 Aug 2007 06:00:28 GMT</pubDate><ttl>60</ttl><item><title>用JDOM操作XML文件</title><link>http://www.blogjava.net/WshmAndLily/articles/138292.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Tue, 21 Aug 2007 02:28:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/138292.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/138292.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/138292.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/138292.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/138292.html</trackback:ping><description><![CDATA[Java&nbsp;+&nbsp;XML&nbsp;=&nbsp;JDOM&nbsp;！&nbsp;<br>这就是JDOM设计者的目标。如果你曾经使用过烦人的SAX或是DOM来处理XML，你就会知道为什么要有JDOM或者是JAXB。在今年（2002）的JavaOne会议上JDOM的主要创始人Jason&nbsp;Hunter有一篇精彩的演讲介绍了JDOM技术，题目就是JDOM&nbsp;Makes&nbsp;XML&nbsp;Easy。&nbsp;<br>获得并安装JDOM&nbsp;<br>在http://jdom.org可以下载JDOM的最新版本。以JDOM&nbsp;beta8的2进制版本为例。下载后解压缩，JDOM的jar文件就是build目录下的文件jdom.jar，将之加入类路径。另外JDOM还需要lib目录下那些jar文件如xerces.jar,jaxp.jar的支持。如果在使用中出现以下错误：&nbsp;<br>java.lang.NoSuchMethodError&nbsp;<br>或&nbsp;<br>java.lang.NoClassDefFoundError:&nbsp;org/xml/sax/SAXNotRecognizedException&nbsp;<br>你需要保证xerces.jar文件在CLASSPATH中位于其他XML类，如JAXP或Crimson之前，这些类文件，包括以前老版本的xerces，可能不支持SAX2.0或DOM&nbsp;Level&nbsp;2。于是导致了上面的错误。&nbsp;<br><br>一个简单的例子&nbsp;<br>JDOM的处理方式有些类似于DOM，但它主要是用SAX实现的，你不必担心处理速度和内存的问题。另外，JDOM中几乎没有接口，的类全部是实实在在的类，没有类工厂类的。<br><br>下面是实例用的XML文件:<br><br>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="GBK"?&gt;<br>&lt;书库&gt;<br>&lt;书&gt;<br>&lt;书名&gt;Java编程入门&lt;/书名&gt;<br>&lt;作者&gt;张三&lt;/作者&gt;<br>&lt;出版社&gt;电子出版社&lt;/出版社&gt;<br>&lt;价格&gt;35.0&lt;/价格&gt;<br>&lt;出版日期&gt;2002-10-07&lt;/出版日期&gt;<br>&lt;/书&gt;<br>&lt;书&gt;<br>&lt;书名&gt;XML在Java中的应用&lt;/书名&gt;<br>&lt;作者&gt;李四&lt;/作者&gt;<br>&lt;出版社&gt;希望出版社&lt;/出版社&gt;<br>&lt;价格&gt;92.0&lt;/价格&gt;<br>&lt;出版日期&gt;2002-10-07&lt;/出版日期&gt;<br>&lt;/书&gt;<br>&lt;/书库&gt;<br><br>下面是操作XML文件的Bean:<br>package&nbsp;xml;<br>/**<br>*&nbsp;XML的读写操作Bean<br>*/<br>import&nbsp;java.io.*;<br>import&nbsp;java.util.*;<br>import&nbsp;org.jdom.*;<br>import&nbsp;org.jdom.output.*;<br>import&nbsp;org.jdom.input.*;<br>import&nbsp;javax.servlet.*;<br>import&nbsp;javax.servlet.http.*;<br>public&nbsp;class&nbsp;XmlBean{<br>private&nbsp;String&nbsp;bookname,author,pub,price,pubdate;<br>public&nbsp;String&nbsp;getbookname()&nbsp;{&nbsp;return&nbsp;bookname;}<br>public&nbsp;String&nbsp;getauthor()&nbsp;{&nbsp;return&nbsp;author;}<br>public&nbsp;String&nbsp;getpub()&nbsp;{&nbsp;return&nbsp;pub;}<br>public&nbsp;String&nbsp;getprice()&nbsp;{&nbsp;return&nbsp;price;}<br>public&nbsp;String&nbsp;getpubdate()&nbsp;{&nbsp;return&nbsp;pubdate;}<br>public&nbsp;void&nbsp;setbookname(String&nbsp;bookname)&nbsp;{&nbsp;this.bookname&nbsp;=bookname&nbsp;;&nbsp;}<br>public&nbsp;void&nbsp;setauthor(String&nbsp;author)&nbsp;{&nbsp;this.author&nbsp;=author;&nbsp;}<br>public&nbsp;void&nbsp;setpub(String&nbsp;pub)&nbsp;{&nbsp;this.pub&nbsp;=pub&nbsp;;&nbsp;}<br>public&nbsp;void&nbsp;setprice(String&nbsp;price)&nbsp;{&nbsp;this.price&nbsp;=price&nbsp;;&nbsp;}<br>public&nbsp;void&nbsp;setpubdate(String&nbsp;pubdate)&nbsp;{&nbsp;this.pubdate&nbsp;=pubdate&nbsp;;&nbsp;}<br>public&nbsp;XmlBean(){}<br>/**<br>*&nbsp;读取XML文件所有信息<br>*/<br>public&nbsp;Vector&nbsp;LoadXML(String&nbsp;path)throws&nbsp;Exception{<br>Vector&nbsp;xmlVector&nbsp;=&nbsp;null;<br>FileInputStream&nbsp;fi&nbsp;=&nbsp;null;<br>try{<br>fi&nbsp;=&nbsp;new&nbsp;FileInputStream(path);<br>xmlVector&nbsp;=&nbsp;new&nbsp;Vector();<br>SAXBuilder&nbsp;sb&nbsp;=&nbsp;new&nbsp;SAXBuilder();<br>Document&nbsp;doc&nbsp;=&nbsp;sb.build(fi);<br>Element&nbsp;root&nbsp;=&nbsp;doc.getRootElement();&nbsp;//得到根元素<br>List&nbsp;books&nbsp;=&nbsp;root.getChildren();&nbsp;//得到根元素所有子元素的集合<br>Element&nbsp;book&nbsp;=null;<br>XmlBean&nbsp;xml&nbsp;=null;<br>for(int&nbsp;i=0;i&lt;books.size();i++){<br>xml&nbsp;=&nbsp;new&nbsp;XmlBean();<br>book&nbsp;=&nbsp;(Element)books.get(i&nbsp;);&nbsp;//得到第一本书元素<br>xml.setbookname(book.getChild("书名").getText());<br>xml.setauthor(book.getChild("作者").getText());<br>xml.setpub(book.getChild("出版社").getText());<br>xml.setprice(book.getChild("价格").getText());<br>xml.setpubdate(book.getChild("出版日期").getText());<br>xmlVector.add(xml);<br>}<br>}<br>catch(Exception&nbsp;e){<br>System.err.println(e+"error");<br>}<br>finally{<br>try{<br>fi.close();<br>}<br>catch(Exception&nbsp;e){<br>e.printStackTrace();<br>}<br>}<br>return&nbsp;xmlVector;<br>}<br>/**<br>*&nbsp;删除XML文件指定信息<br>*/<br>public&nbsp;static&nbsp;void&nbsp;DelXML(HttpServletRequest&nbsp;request)throws&nbsp;Exception{<br>FileInputStream&nbsp;fi&nbsp;=&nbsp;null;<br>FileOutputStream&nbsp;fo&nbsp;=&nbsp;null;<br>try{<br>String&nbsp;path=request.getParameter("path");<br>int&nbsp;xmlid=Integer.parseInt(request.getParameter("id"));<br>fi&nbsp;=&nbsp;new&nbsp;FileInputStream(path);<br>SAXBuilder&nbsp;sb&nbsp;=&nbsp;new&nbsp;SAXBuilder();<br>Document&nbsp;doc&nbsp;=&nbsp;sb.build(fi);<br>Element&nbsp;root&nbsp;=&nbsp;doc.getRootElement();&nbsp;//得到根元素<br>List&nbsp;books&nbsp;=&nbsp;root.getChildren();&nbsp;//得到根元素所有子元素的集合<br>books.remove(xmlid);//删除指定位置的子元素<br>String&nbsp;indent&nbsp;=&nbsp;"&nbsp;";<br>boolean&nbsp;newLines&nbsp;=&nbsp;true;<br>XMLOutputter&nbsp;outp&nbsp;=&nbsp;new&nbsp;XMLOutputter(indent,newLines,"GBK");<br>fo=new&nbsp;FileOutputStream(path);<br>outp.output(doc,fo);<br>}<br>catch(Exception&nbsp;e){<br>System.err.println(e+"error");<br>}<br>finally{<br>try{<br>fi.close();<br>fo.close();<br>}<br>catch(Exception&nbsp;e){<br>e.printStackTrace();<br>}<br>}<br>}<br>/**<br>*&nbsp;添加XML文件指定信息<br>*/<br>public&nbsp;static&nbsp;void&nbsp;AddXML(HttpServletRequest&nbsp;request)throws&nbsp;Exception{<br>FileInputStream&nbsp;fi&nbsp;=&nbsp;null;<br>FileOutputStream&nbsp;fo&nbsp;=&nbsp;null;<br>try{<br>String&nbsp;path=request.getParameter("path");<br>fi&nbsp;=&nbsp;new&nbsp;FileInputStream(path);<br>SAXBuilder&nbsp;sb&nbsp;=&nbsp;new&nbsp;SAXBuilder();<br>Document&nbsp;doc&nbsp;=&nbsp;sb.build(fi);<br>Element&nbsp;root&nbsp;=&nbsp;doc.getRootElement();&nbsp;//得到根元素<br>List&nbsp;books&nbsp;=&nbsp;root.getChildren();&nbsp;//得到根元素所有子元素的集合<br>String&nbsp;bookname=request.getParameter("bookname");<br>String&nbsp;author=request.getParameter("author");<br>String&nbsp;price=request.getParameter("price");<br>String&nbsp;pub=request.getParameter("pub");<br>String&nbsp;pubdate=request.getParameter("pubdate");<br>Text&nbsp;newtext;<br>Element&nbsp;newbook=&nbsp;new&nbsp;Element("书");<br>Element&nbsp;newname=&nbsp;new&nbsp;Element("书名");<br>newname.setText(bookname);<br>newbook.addContent(newname);<br>Element&nbsp;newauthor=&nbsp;new&nbsp;Element("作者");<br>newauthor.setText(author);<br>newbook.addContent(newauthor);<br>Element&nbsp;newpub=&nbsp;new&nbsp;Element("出版社");<br>newpub.setText(pub);<br>newbook.addContent(newpub);<br>Element&nbsp;newprice=&nbsp;new&nbsp;Element("价格");<br>newprice.setText(price);<br>newbook.addContent(newprice);<br>Element&nbsp;newdate=&nbsp;new&nbsp;Element("出版日期");<br>newdate.setText(pubdate);<br>newbook.addContent(newdate);<br>books.add(newbook);//增加子元素<br>String&nbsp;indent&nbsp;=&nbsp;"&nbsp;";<br>boolean&nbsp;newLines&nbsp;=&nbsp;true;<br>XMLOutputter&nbsp;outp&nbsp;=&nbsp;new&nbsp;XMLOutputter(indent,newLines,"GBK");<br>fo=new&nbsp;FileOutputStream(path);<br>outp.output(doc,fo);<br>}<br>catch(Exception&nbsp;e){<br>System.err.println(e+"error");<br>}<br>finally{<br>try{<br>fi.close();<br>fo.close();<br>}<br>catch(Exception&nbsp;e){<br>e.printStackTrace();<br>}<br>}<br>}<br>/**<br>*&nbsp;修改XML文件指定信息<br>*/<br>public&nbsp;static&nbsp;void&nbsp;EditXML(HttpServletRequest&nbsp;request)throws&nbsp;Exception{<br>FileInputStream&nbsp;fi&nbsp;=&nbsp;null;<br>FileOutputStream&nbsp;fo&nbsp;=&nbsp;null;<br>try{<br>String&nbsp;path=request.getParameter("path");<br>int&nbsp;xmlid=Integer.parseInt(request.getParameter("id"));<br>fi&nbsp;=&nbsp;new&nbsp;FileInputStream(path);<br>SAXBuilder&nbsp;sb&nbsp;=&nbsp;new&nbsp;SAXBuilder();<br>Document&nbsp;doc&nbsp;=&nbsp;sb.build(fi);<br>Element&nbsp;root&nbsp;=&nbsp;doc.getRootElement();&nbsp;//得到根元素<br>List&nbsp;books&nbsp;=&nbsp;root.getChildren();&nbsp;//得到根元素所有子元素的集合<br>Element&nbsp;book=(Element)books.get(xmlid);<br>String&nbsp;bookname=request.getParameter("bookname");<br>String&nbsp;author=request.getParameter("author");<br>String&nbsp;price=request.getParameter("price");<br>String&nbsp;pub=request.getParameter("pub");<br>String&nbsp;pubdate=request.getParameter("pubdate");<br>Text&nbsp;newtext;<br>Element&nbsp;newname=&nbsp;book.getChild("书名");<br>newname.setText(bookname);//修改书名为新的书名<br>Element&nbsp;newauthor=&nbsp;book.getChild("作者");<br>newauthor.setText(author);<br>Element&nbsp;newpub=&nbsp;book.getChild("出版社");<br>newpub.setText(pub);<br>Element&nbsp;newprice=&nbsp;book.getChild("价格");<br>newprice.setText(price);<br>Element&nbsp;newdate=&nbsp;book.getChild("出版日期");<br>newdate.setText(pubdate);<br>//books.set(xmlid,book);//修改子元素<br>String&nbsp;indent&nbsp;=&nbsp;"&nbsp;";<br>boolean&nbsp;newLines&nbsp;=&nbsp;true;<br>XMLOutputter&nbsp;outp&nbsp;=&nbsp;new&nbsp;XMLOutputter(indent,newLines,"GBK");<br>fo=new&nbsp;FileOutputStream(path);<br>outp.output(doc,fo);<br>}<br>catch(Exception&nbsp;e){<br>System.err.println(e+"error");<br>}<br>finally{<br>try{<br>fi.close();<br>fo.close();<br>}<br>catch(Exception&nbsp;e){<br>e.printStackTrace();<br>}<br>}<br>}<br>}<br><br>下面是操作的jsp文件:<br>&lt;%@&nbsp;page&nbsp;contentType="text/html;charset=GBK"&nbsp;%&gt;<br>&lt;%@&nbsp;page&nbsp;language="java"&nbsp;import="java.util.*,xml.*"%&gt;<br>&lt;html&gt;<br>&lt;head&gt;<br>&lt;title&gt;读取XML文件资料&lt;/title&gt;<br>&lt;/head&gt;<br>&lt;body&gt;<br>&lt;h3&nbsp;align="center"&gt;JDOM操作XML文件&lt;/h3&gt;<br>&lt;p&nbsp;align="center"&gt;读取XML文件中的所有资料&lt;/p&gt;<br>&lt;center&gt;<br>&lt;table&nbsp;border="1"&nbsp;cellpadding="0"&nbsp;cellspacing="1"&nbsp;style="border-collapse:&nbsp;collapse"&nbsp;width="80%"&nbsp;id="AutoNumber1"&gt;<br>&lt;tr&gt;<br>&lt;td&nbsp;align="center"&nbsp;width="92"&gt;书名&lt;/td&gt;<br>&lt;td&nbsp;align="center"&nbsp;width="92"&gt;作者&lt;/td&gt;<br>&lt;td&nbsp;align="center"&nbsp;width="92"&gt;出版社&lt;/td&gt;<br>&lt;td&nbsp;align="center"&nbsp;width="92"&gt;价格&lt;/td&gt;<br>&lt;td&nbsp;align="center"&nbsp;width="92"&gt;出版日期&lt;/td&gt;<br>&lt;td&nbsp;align="center"&nbsp;width="94"&gt;操作&lt;/td&gt;<br>&lt;/tr&gt;<br>&lt;/table&gt;<br>&lt;%<br>String&nbsp;path&nbsp;=&nbsp;application.getRealPath("/test/xml/")+"testC.xml";<br>XmlBean&nbsp;xml=new&nbsp;XmlBean();<br>Vector&nbsp;xmlall=xml.LoadXML(path);<br>for(int&nbsp;i=0;i&lt;xmlall.size();i++){<br>xml=(XmlBean)xmlall.elementAt(i&nbsp;);<br>/**out.println("书名:"+xml.getbookname()+"&lt;br&gt;");<br>out.println("作者:"+xml.getauthor()+"&lt;br&gt;");<br>out.println("出版社:"+xml.getpub()+"&lt;br&gt;");<br>out.println("价格:"+xml.getprice()+"&lt;br&gt;");<br>out.println("出版日期:"+xml.getpubdate()+"&lt;br&gt;&lt;br&gt;");<br>*/<br>%&gt;<br>&lt;table&nbsp;border="1"&nbsp;cellpadding="0"&nbsp;cellspacing="1"&nbsp;style="border-collapse:&nbsp;collapse"&nbsp;width="80%"&nbsp;id="AutoNumber2"&gt;<br>&lt;tr&gt;<br>&lt;td&nbsp;align="center"&nbsp;width="92"&gt;&lt;%=xml.getbookname()%&gt;&lt;/td&gt;<br>&lt;td&nbsp;align="center"&nbsp;width="92"&gt;&lt;%=xml.getauthor()%&gt;&lt;/td&gt;<br>&lt;td&nbsp;align="center"&nbsp;width="92"&gt;&lt;%=xml.getpub()%&gt;&lt;/td&gt;<br>&lt;td&nbsp;align="center"&nbsp;width="92"&gt;&lt;%=xml.getprice()%&gt;&lt;/td&gt;<br>&lt;td&nbsp;align="center"&nbsp;width="92"&gt;&lt;%=xml.getpubdate()%&gt;&lt;/td&gt;<br>&lt;td&nbsp;align="center"&nbsp;width="94"&gt;&lt;a&nbsp;href="xmlok.jsp?act=del&amp;id=&lt;%=i%&gt;&amp;path=&lt;%=path%&gt;"&gt;删除&lt;/a&gt;&lt;/td&gt;<br>&lt;/tr&gt;<br>&lt;/table&gt;<br>&lt;%}%&gt;<br>&lt;/center&gt;<br>&lt;form&nbsp;method="POST"&nbsp;action="xmlok.jsp"&gt;<br>&lt;p&nbsp;align="center"&gt;<br>&lt;input&nbsp;type="radio"&nbsp;value="add"&nbsp;checked&nbsp;name="act"&gt;添加资料&nbsp;&lt;input&nbsp;type="radio"&nbsp;value="edit"&nbsp;name="act"&gt;编辑资料<br>序&nbsp;号:&lt;select&nbsp;size="1"&nbsp;name="id"&gt;<br>&lt;%for(int&nbsp;i=0;i&lt;xmlall.size();i++){%&gt;<br>&lt;option&nbsp;value="&lt;%=i%&gt;"&gt;第&lt;%=i+1%&gt;条&lt;/option&gt;<br>&lt;%}%&gt;<br>&lt;/select&gt;&lt;br&gt;<br>书&nbsp;名:&lt;input&nbsp;type="text"&nbsp;name="bookname"&nbsp;size="20"&gt;&lt;br&gt;<br>作&nbsp;者:&lt;input&nbsp;type="text"&nbsp;name="author"&nbsp;size="20"&gt;&lt;br&gt;<br>出版社:&lt;input&nbsp;type="text"&nbsp;name="pub"&nbsp;size="20"&gt;&lt;br&gt;<br>价&nbsp;格:&lt;input&nbsp;type="text"&nbsp;name="price"&nbsp;size="20"&gt;&lt;br&gt;<br>日&nbsp;期:&lt;input&nbsp;type="text"&nbsp;name="pubdate"&nbsp;size="20"&gt;&lt;/p&gt;<br>&lt;input&nbsp;type="hidden"&nbsp;name="path"&nbsp;value="&lt;%=path%&gt;"&gt;<br>&lt;p&nbsp;align="center"&gt;&lt;input&nbsp;type="submit"&nbsp;value="提交"&nbsp;name="B1"&gt;&lt;input&nbsp;type="reset"&nbsp;value="重置"&nbsp;name="B2"&gt;&lt;/p&gt;<br>&lt;/form&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;<br><br>下面是处理上一文件提交的jsp文件:<br>&lt;%@&nbsp;page&nbsp;contentType="text/html;charset=GBK"&nbsp;%&gt;<br>&lt;%@&nbsp;page&nbsp;language="java"&nbsp;import="xml.*"%&gt;<br>&lt;%if(request.getParameter("act")!=null&nbsp;&amp;&amp;&nbsp;request.getParameter("act").equals("add")){<br>XmlBean.AddXML(request);<br>out.println("&lt;p&nbsp;align=&#8217;center&#8217;&gt;&lt;br&gt;&lt;br&gt;添加成功&lt;br&gt;&lt;br&gt;&lt;a&nbsp;href=&#8217;&#8217;&gt;返回&lt;/a&gt;");<br>}<br>else&nbsp;if(request.getParameter("act")!=null&nbsp;&amp;&amp;&nbsp;request.getParameter("act").equals("del")){<br>XmlBean.DelXML(request);<br>out.println("&lt;p&nbsp;align=&#8217;center&#8217;&gt;&lt;br&gt;&lt;br&gt;删除成功&lt;br&gt;&lt;br&gt;&lt;a&nbsp;href=&#8217;&#8217;&gt;返回&lt;/a&gt;");<br>}<br>else&nbsp;if(request.getParameter("act")!=null&nbsp;&amp;&amp;&nbsp;request.getParameter("act").equals("edit")){<br>XmlBean.EditXML(request);<br>out.println("&lt;p&nbsp;align=&#8217;center&#8217;&gt;&lt;br&gt;&lt;br&gt;修改成功&lt;br&gt;&lt;br&gt;&lt;a&nbsp;href=&#8217;&#8217;&gt;返回&lt;/a&gt;");<br>}<br>else{out.print("&lt;p&nbsp;align=&#8217;center&#8217;&gt;&lt;br&gt;&lt;br&gt;非法操作&lt;br&gt;&lt;br&gt;&lt;a&nbsp;href=&#8217;&#8217;&gt;返回&lt;/a&gt;");} 
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/138292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-08-21 10:28 <a href="http://www.blogjava.net/WshmAndLily/articles/138292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java xml</title><link>http://www.blogjava.net/WshmAndLily/articles/135827.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 10 Aug 2007 06:25:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/135827.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/135827.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/135827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/135827.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/135827.html</trackback:ping><description><![CDATA[<div class=diaryBody>
<p>在IBM的developerWorks上有两篇非常优秀的关于<span style="COLOR: #cc0000">Java</span><span style="COLOR: #cc0000">XML</span> API的评测文章：</p>
<p><a href="http://www-900.ibm.com/developerWorks/cn/xml/x-injava/index.shtml" target=_blank><span style="COLOR: #cc0000">Java</span><font color=#444444> </font><font color=#006699>中</font><font color=#444444> </font><span style="COLOR: #cc0000">XML</span><font color=#444444> </font><font color=#006699>文档模型的性能</font><font color=#444444> </font></a></p>
<p><a href="http://www-900.ibm.com/developerWorks/cn/xml/x-injava2/index.shtml" target=_blank><span style="COLOR: #cc0000">Java</span><font color=#444444> </font><font color=#006699>中</font><font color=#444444> </font><span style="COLOR: #cc0000">XML</span><font color=#444444> </font><font color=#006699>文档模型的用法</font><font color=#444444> </font></a></p>
<p>对这两篇文章我想说的就是 <strong>吐血推荐</strong></p>
<p><span style="COLOR: #cc0000">Java</span>的<span style="COLOR: #cc0000">XML</span> API这几篇文章该讲的都讲到了，我只想补充几点：</p>
<a name=A2></a>
<h4>一、Crimson和Xerces恩仇录</h4>
<blockquote>
<p>Crimson来自于Sun捐赠给Apache的ProjectX项目，Xerces来自IBM捐赠给Apache的<span style="COLOR: #cc0000">XML</span>4J项目，结果Xerces胜出，成了Apache <span style="COLOR: #cc0000">XML</span>小组全力开发的<span style="COLOR: #cc0000">XML</span> API，而Crimon已经早就不做了，如今Xerces名满天下，到处都是在用Xerces DOM和SAX解析器，只有Sun不服气，非要在JDK1.4里面使用过时的Crimson，让人感觉像是在赌气一样，真是让人可怜又可气！不过IBM发行JDK用的<span style="COLOR: #cc0000">XML</span> 解析器自然是Xerces。</p>
<p>由于JDK的Class Loader的优先级关系，当你采用JAXP编写<span style="COLOR: #cc0000">XML</span>程序的时候，即使把Xerces包引入CLASSPATH，JDK还是会顽固的使用Crimson，这一点通过打开JVM的verbose参数可以观察到。不过JDK也允许你采用其它的解析器，因此我们可以通过在JRE\lib\目录下建一个jaxp.properties的文件，来替换解析器，jaxp.properties内容如下：</p>
<pre class=code>								<span style="COLOR: #cc0000">java</span>x.<span style="COLOR: #cc0000">xml</span>.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
<span style="COLOR: #cc0000">java</span>x.<span style="COLOR: #cc0000">xml</span>.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl
</pre>
<p>这样就可以使用Xerces，当然你必须还是要把Xerces包放到CLASSPATH下。</p>
</blockquote><a name=A3></a>
<h4>二、JAXP的姗姗来迟</h4>
<blockquote>
<p>Sun在<span style="COLOR: #cc0000">XML</span>领域总是后知后觉，等到Sun重视<span style="COLOR: #cc0000">XML</span>的时候，<span style="COLOR: #cc0000">XML</span>的API早就满天 飞了，尤其是IBM具有非常大的领先优势。不过Sun是规范的制订者，于是参考W3C的标准制订了JAXP规范。JAXP不像Xerces和Crimon那样，它只是一个spec，本身是不做任何事情的，它的作用就是提出一个统一的接口，让其它的<span style="COLOR: #cc0000">XML</span> API都来遵循JAXP编程，那么用JAXP写出来的程序，底层的API可以任意切换。</p>
<p>具体来说JAXP包括了几个工厂类，这就是JDK1.4里面的<span style="COLOR: #cc0000">java</span>x.<span style="COLOR: #cc0000">xml</span>.parsers 包，用来寻找符合DOM标准的<span style="COLOR: #cc0000">XML</span> API实现类的位置；此外JAXP还包括一整套interface，这就是JDK1.4里面的org.w3c.dom那几个包。工厂类负责加载DOM的实现类。那么加载的规则是什么呢？</p>
<p>我是通过阅读JAXP的源代码知道的，工厂类首先会根据<span style="COLOR: #cc0000">java</span>命令行传入的参数进行寻找，然后在根据JRE\lib\jaxp.properties中定义的实现类寻找，最后什么都找不到的话，就用Crimson。注意Crimons是由Bootstrap Class Loader来load的，如果你不通过上面两个方法来改变工厂的寻找顺序，那么铁定用Crimson了 :(</p>
</blockquote><a name=A4></a>
<h4>三、DOM解析器和DOM API</h4>
<blockquote>
<p>当你严格采用JAXP编程的时候，是遵循W3C的DOm标准的，那么在JAXP底层你实际上可以任意切换不同的DOM实现，例如Xerces，或者Crimon，再或者其它，切换方法就是配置jaxp.properties。因此JAXP就是一些标准接口而已。</p>
<p>而Xerces和Crimon也不单单是一个DOM实现那么简单，他们本身实际上也包含SAX解析器和DOM解析器。所以一个JAXP程序下面有如下层次：</p>
<pre class=code>JAXP应用程序 -&gt; JAXP接口 -&gt; Xerces DOM实现 -&gt; Xerces DOM/SAX 解析器
</pre>
<p>只要你用JAXP编程，那么你就可以切换到Crimson上来</p>
<pre class=code>JAXP应用程序 -&gt; JAXP接口 -&gt; Crimson DOM实现 -&gt; Crimson DOM/SAX 解析器
</pre>
<p>另外你也可以这样来做：</p>
<pre class=code>JAXP应用程序 -&gt; JAXP接口 -&gt; Crimson DOM实现 -&gt; Xerces DOM/SAX 解析器
</pre>
<p>不过如果你的程序不安装JAXP来写，那么就没有办法切换不同的DOM实现了。</p>
</blockquote><a name=A5></a>
<h4>四、不是标准的dom4j和jdom</h4>
<blockquote>
<p>W3C的DOM标准API难用的让人想撞墙，于是有一帮人开发<span style="COLOR: #cc0000">Java</span>专用的<span style="COLOR: #cc0000">XML</span> API目的是为了便于使用，这就是jdom的由来，开发到一半的时候，另一部分人又分了出来，他们有自己的想法，于是他们就去开发dom4j，形成了今天这样两个API，至于他们之间的性能，功能之比较看看上面我推荐的文章就知道了，jdom全面惨败。</p>
<p>jdom 相当于上面的 JAXP接口 ＋ Xerces DOM实现部分，它本身没有解析器，它可以使用Xerces或者Crimson的解析器，就是这样：</p>
<pre class=code>jdom应用程序 -&gt; jdom API -&gt; Xerces/Crimson解析器
</pre>
<p>dom4j 和jdom类似，不过他自己绑定了一个叫做Alfred2的解析器，功能不是很全，但是速度很快，当没有其它的解析器的时候，dom4j将使用Alfred2解析器，如下：</p>
<pre class=code>dom4j应用程序 -&gt; dom4j API -&gt;  Xerces/Crimson解析器
</pre>
<p>或者</p>
<pre class=code>dom4j应用程序 -&gt; dom4j API -&gt;  Alfred2解析器
</pre>
<p>你在SF上下载的dom4j.jar是不含 Alfred2解析器的，而dom4j-full.jar包含了 Alfred2解析器，在这种情况下，实际上你什么也不需要，光是一个dom4j-full.jar就全部都包括了。</p>
<p>因此可以看出采用dom4j/jdom编写的应用程序，已经不具备可移植性了。</p>
</blockquote><a name=A6></a>
<h4>五、小插曲</h4>
<blockquote>
<p>Sun是JAXP标准的制订者，甚至很执著的在JDK1.4里面绑定Crimson DOM实现和解析器，然后可笑的是，Sun自己的JAXM RI竟然不是用JAXP写出来的，而是dom4j，制订标准让大家遵守，自己却监守自盗，这未免太说不过去了吧！</p>
<p>BTW: Hibernate也用的是dom4j来读取<span style="COLOR: #cc0000">XML</span>配置文件，如今已经越来越多的程序纷纷采用dom4j，如果你不是那么在乎可移植性，我强烈建议你采用dom4j。</p>
</blockquote></div>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/135827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-08-10 14:25 <a href="http://www.blogjava.net/WshmAndLily/articles/135827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用jdom操纵xml文档例子</title><link>http://www.blogjava.net/WshmAndLily/articles/120266.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Sun, 27 May 2007 03:03:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/120266.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/120266.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/120266.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/120266.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/120266.html</trackback:ping><description><![CDATA[<p>package com.semovy.test;</p>
<p>import java.io.File;<br>import java.io.FileOutputStream;<br>import java.io.IOException;</p>
<p>import org.jdom.Document;<br>import org.jdom.Element;<br>import org.jdom.output.XMLOutputter;</p>
<p>public class Test {</p>
<p>&nbsp;/**<br>&nbsp; * @param args<br>&nbsp; */<br>&nbsp;public static void main(String[] args) {<br>&nbsp;&nbsp;// TODO Auto-generated method stub<br>&nbsp;&nbsp;//System.out.print(new MD5().getMD5ofStr(""));<br>&nbsp;&nbsp;sampleJDom();<br>&nbsp;}<br>&nbsp;&nbsp; /*<br>&nbsp;&nbsp;&nbsp; * jdom<br>&nbsp;&nbsp;&nbsp; */<br>&nbsp;public static void sampleJDom()<br>&nbsp;{<br>&nbsp;&nbsp;//新建文档对象<br>&nbsp;&nbsp;Document doc = new Document();<br>&nbsp;&nbsp;//新建根节点<br>&nbsp;&nbsp;Element book = new Element("book");<br>&nbsp;&nbsp;book.setAttribute("title", "Programming with Ajax");<br>&nbsp;&nbsp;Element chapter1 = new Element("chapter");<br>&nbsp;&nbsp;chapter1.setAttribute("name", "Chapter1 About Ajax");<br>&nbsp;&nbsp;Element chapter2 = new Element("chapter");<br>&nbsp;&nbsp;chapter2.setAttribute("name", "Chapter2 B/S Structure");<br>&nbsp;&nbsp;Element section1 = new Element("section");<br>&nbsp;&nbsp;section1.addContent("What is Ajax?");<br>&nbsp;&nbsp;Element section2 = new Element("section");<br>&nbsp;&nbsp;section2.addContent("Definiens of Ajax");<br>&nbsp;&nbsp;Element section3 = new Element("section");<br>&nbsp;&nbsp;section3.addContent("HTTP Protocal");<br>&nbsp;&nbsp;Element section4 = new Element("section");<br>&nbsp;&nbsp;section4.addContent("Web Design");<br>&nbsp;&nbsp;//将子节点加入到父节点<br>&nbsp;&nbsp;chapter1.addContent(section1);<br>&nbsp;&nbsp;chapter1.addContent(section2);<br>&nbsp;&nbsp;chapter2.addContent(section3);<br>&nbsp;&nbsp;chapter2.addContent(section4);<br>&nbsp;&nbsp;book.addContent(chapter1);<br>&nbsp;&nbsp;book.addContent(chapter2);<br>&nbsp;&nbsp;doc.addContent(book);<br>&nbsp;&nbsp;//将文档输出到控制台 <br>&nbsp;&nbsp;XMLOutputter outputter = new XMLOutputter();<br>&nbsp;&nbsp;try<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;outputter.output(doc, new FileOutputStream(new File("c:/a.xml")));<br>&nbsp;&nbsp;&nbsp;System.out.println("输出到文件成功!");<br>&nbsp;&nbsp;&nbsp;outputter.output(doc, System.out);<br>&nbsp;&nbsp;&nbsp;System.out.println("输出到控制台!");<br>&nbsp;&nbsp;}catch(IOException ex)<br>&nbsp;&nbsp;{}<br>&nbsp;}<br>}</p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/120266.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-05-27 11:03 <a href="http://www.blogjava.net/WshmAndLily/articles/120266.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML语法</title><link>http://www.blogjava.net/WshmAndLily/articles/120255.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Sun, 27 May 2007 02:24:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/120255.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/120255.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/120255.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/120255.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/120255.html</trackback:ping><description><![CDATA[<font color=#363636>一.XML语法规则&nbsp;<br>二.元素的语法&nbsp;<br>三.注释的语法&nbsp;<br>四.CDATA的语法&nbsp;<br>五.Namespaces的语法&nbsp;<br>六.entity的语法&nbsp;<br>七.DTD的语法&nbsp;<br><br>通过前面三章的学习，我们已经对什么是XML，它的实现原理以及相关的术语有所了解。接下来我们就开始学习XML的语法规范，动手写自己的XML文档。<br><br>一.XML语法规则<br><br>XML的文档和HTML的原代码类似，也是用标识来标识内容。创建XML文档必须遵守下列重要规则：<br>规则1：必须有XML声明语句<br>这一点我们在上一章学习时已经提到过。声明是XML文档的第一句，其格式如下：<br>&lt;?xml&nbsp;version="1.0"&nbsp;standalone="yes/no"&nbsp;encoding="UTF-8"?&gt;&nbsp;<br>声明的作用是告诉浏览器或者其它处理程序：这个文档是XML文档。声明语句中的version表示文档遵守的XML规范的版本；standalone表示文档是否附带DTD文件，如果有，参数为no；encoding表示文档所用的语言编码，默认是UTF-8。<br><br>规则2：是否有DTD文件<br>如果文档是一个"有效的XML文档"(见上一章)，那么文档一定要有相应DTD文件，并且严格遵守DTD文件制定的规范。DTD文件的声明语句紧跟在XML声明语句后面，格式如下：<br>&lt;!DOCTYPE&nbsp;type-of-doc&nbsp;SYSTEM/PUBLIC&nbsp;"dtd-name"&gt;&nbsp;<br>其中：<br>"!DOCTYPE"是指你要定义一个DOCTYPE;<br>"type-of-doc"是文档类型的名称，由你自己定义，通常于DTD文件名相同；<br>"SYSTEM/PUBLIC"这两个参数只用其一。SYSTEM是指文档使用的私有DTD文件的网址，而PUBLIC则指文档调用一个公用的DTD文件的网址。<br>"dtd-name"&nbsp;就是DTD文件的网址和名称。所有DTD文件的后缀名为".dtd"。<br>我们还是用上面的例子，应该写成这样：<br>&lt;?xml&nbsp;version="1.0"&nbsp;standalone="no"&nbsp;encode="UTF-8"?&gt;<br>&lt;!DOCTYPE&nbsp;filelist&nbsp;SYSTEM&nbsp;"filelist.dtd"&gt;<br><br>规则3：注意你的大小写<br>在XML文档中，大小写是有区别的。&lt;P&gt;和&lt;p&gt;是不同的标识。注意在写元素时，前后标识大小写要保持一样。例如:&lt;Author&gt;ajie&lt;/Author&gt;，写成&lt;Author&gt;ajie&lt;/author&gt;是错误的。<br>你最好养成一种习惯，或者全部大写，或者全部小写，或者大写第一个字母。这样可以减少因为大小写不匹配产生的文档错误。<br><br>规则4：给属性值加引号<br>在HTML代码里面，属性值可以加引号，也可以不加。例如:&lt;font&nbsp;color=red&gt;word&lt;/font&gt;和&lt;font&nbsp;color="red"&gt;word&lt;/font&gt;都可以被浏览器正确解释。<br>但是在XML中则规定，所有属性值必须加引号(可以是单引号，也可以是双引号)，否则将被视为错误。<br><br>规则5：所有的标识必须有相应的结束标识<br>在HTML中，标识可能不是成对出现的，比?lt;br&gt;。而在XML中规定，所有标识必须成对出现，有一个开始标识，就必须有一个结束标识。否则将被视为错误。<br><br>规则6：所有的空标识也必须被关闭<br>空标识就是标识对之间没有内容的标识。比如&lt;br&gt;,&lt;img&gt;等标识。在XML中，规定所有的标识必须有结束标识，针对这样的空标识，XML中处理的方法是在原标识最后加/，就可以了。例如：<br>&lt;br&gt;应写为&lt;br&nbsp;/&gt;；<br>&lt;META&nbsp;name="keywords"&nbsp;content="XML,&nbsp;SGML,&nbsp;HTML"&gt;应写为&lt;META&nbsp;name="keywords"&nbsp;content="XML,&nbsp;SGML,&nbsp;HTML"&nbsp;/&gt;；<br>&lt;IMG&nbsp;src="http://127.0.0.1/Files/BeyondPic/2007-4/19/0741911323322151.gif""&nbsp;/&gt;&nbsp;<br><br><br><br>二.元素的语法&nbsp;<br><br>元素由一对标识以及其中的内容组成。就象这样：ajie。元素的名称和标识的名称是一样的。标识可以用属性来进一步描述。&nbsp;<br><br>在XML中，没有任何保留字，所以你可以随心所欲的用任何词语来作为元素名称。但是也必须遵守下列规范：&nbsp;<br><br>1.名称中可以包含字母、数字以及其它字母；&nbsp;<br><br>2.名称不能以数字或"_"&nbsp;(下划线)开头；&nbsp;<br><br>3.名称不能以字母&nbsp;xml(或&nbsp;XML&nbsp;或&nbsp;Xml&nbsp;..)开头&nbsp;<br><br>4.名称中不能包含空格&nbsp;<br><br>5.名称中间不能包含":"(冒号)&nbsp;<br><br>为了使元素更容易阅读理解和操作，我们还有一些建议：&nbsp;<br><br>1.名称中不要使用"."。因为在很多程序语言中,"."是作为对象的属性，例如：font.color。同样的原因"-"也最好不要用，必须使用的，以"_"代替；&nbsp;<br><br>2.名称尽量简短。&nbsp;<br><br>3.名称的大小写尽量采用同一标准。&nbsp;<br><br>4.名称可以使用非英文字符，比如用中文。但是有些软件可能不支持。(IE5目前是支持中文元素的。)&nbsp;<br><br>另外，补充一点关于属性的说明。在HTML中，属性可以用来定义元素的显示格式，比如：&lt;font&nbsp;color="red"&gt;word&lt;/font&gt;将把word显示为红色。而在XML中，属性只是对标识的描述，与元素内容的显示无关。例如同样一句：&lt;font&nbsp;color="red"&gt;word&lt;/font&gt;，并不会将word显示为红色。(那么，有网友会问：如何在XML中将文字显示为红色呢？这就需要使用CSS或者XSL，我们在下面详细讲述。)&nbsp;<br><br>三.注释的语法&nbsp;<br><br>注释是为了便于阅读和理解，在XML文档添加的附加信息，将不会被程序解释或则浏览器显示。&nbsp;<br><br>注释的语法如下：&nbsp;<br><br>&lt;!--&nbsp;这里是注释信息&nbsp;--&gt;&nbsp;<br><br>可以看到，它和HTML中的注释语法是一样的，非常容易。养成良好的注释习惯将使你的文档更加便于维护，共享，看起来也更专业。&nbsp;<br><br>四.CDATA的语法&nbsp;<br><br>CDATA全称character&nbsp;data，翻译为字符数据。我们在写XML文档时，有时需要显示字母，数字和其它的符号本身，比如"&lt;"，而在XML中，这些字符已经有特殊的含义，我们怎么办呢？这就需要用到CDATA语法。语法格式如下：&nbsp;<br><br>&lt;![CDATA[这里放置需要显示的字符]]&gt;&nbsp;<br><br>例如：&nbsp;<br><br>&lt;![CDATA[&lt;AUTHOR&nbsp;sex="female"&gt;ajie&lt;/AUTHOR&gt;]]&gt;&nbsp;<br><br>在页面上显示的内容将是"&lt;AUTHOR&nbsp;sex="female"&gt;ajie&lt;/AUTHOR&gt;"&nbsp;<br><br><br><br>五.Namespaces的语法&nbsp;<br><br>Namespaces翻译为名字空间。名字空间有什么作用呢？当我们在一个XML文档中使用他人的或者多个DTD文件，就会出现这样的矛盾：因为XML中标识都是自己创建的，在不同的DTD文件中，标识名可能相同但表示的含义不同，这就可能引起数据混乱。<br>比如在一个文档&lt;table&gt;wood&nbsp;table&lt;/table&gt;中&lt;table&gt;表示桌子，<br>而在另一个文档&lt;table&gt;namelist&lt;/table&gt;中&lt;table&gt;表示表格。如果我需要同时处理这两个文档，就会发生名字冲突。<br>了解决这个问题，我们引进了namespaces这个概念。namespaces通过给标识名称加一个网址(URL)定位的方法来区别这些名称相同的标识。&nbsp;<br>Namespaces同样需要在XML文档的开头部分声明，声明的语法如下：<br>&lt;document&nbsp;xmlns:yourname=&#8217;URL&#8217;&gt;<br>其中yourname是由你定义的namespaces的名称，URL就是名字空间的网址。<br>假设上面的"桌子&lt;table&gt;"文档来自http://www.zhuozi.com，我们就可以声明为<br>&lt;document&nbsp;xmlns:zhuozi=&#8217;http://www.zhuozi.com&#8217;&gt;&nbsp;<br>然后在后面的标识中使用定义好的名字空间：<br>&lt;zhuozi:table&gt;wood&nbsp;table&lt;/table&gt;<br>这样就将这两个&lt;table&gt;区分开来。注意的是：设置URL并不是说这个标识真的要到那个网址去读取，仅仅作为一种区别的标志而已。<br><br>六.entity的语法<br><br>entity翻译为"实体"。它的作用类似word中的"宏"，也可以理解为DW中的摸板，你可以预先定义一个entity，然后在一个文档中多次调用，或者在多个文档中调用同一个entity。<br>entity可以包含字符，文字等等，使用entity的好处在于：1.它可以减少差错，文档中多个相同的部分只需要输入一遍就可以了。2.它提高维护效率。比如你有40个文档都包含copyright的entity，如果需要修改这个copyright,不需要所有的文件都修改，只要改最初定义的entity语句就可以了。<br>XML定义了两种类型的entity。一种是我们这里说的普通entity，在XML文档中使用；另一种是参数entity，在DTD文件中使用。<br>entity的定义语法为:<br>&lt;!DOCTYPE&nbsp;filename&nbsp;[<br>&lt;!ENTITY&nbsp;entity-name&nbsp;"entity-content"<br>]<br>&gt;<br>例如我要定<br><br>义一段版权信息:<br>&lt;!DOCTYPE&nbsp;copyright&nbsp;[<br>&lt;!ENTITY&nbsp;copyright&nbsp;"Copyright&nbsp;2001,&nbsp;Ajie.&nbsp;All&nbsp;rights&nbsp;reserved"<br>]<br>&gt;<br>如果我的版权信息内容和他人共享一个XML文件，也可以使用外部调用的方法，语法象这样：<br>&lt;!DOCTYPE&nbsp;copyright&nbsp;[<br>&lt;!ENTITY&nbsp;copyright&nbsp;SYSTEM&nbsp;"http://www.sample.com/copyright.xml"&gt;&nbsp;<br>]<br>&gt;<br>定义好的entity在文档中的引用语法为：&amp;entity-name;<br>例如，上面定义的版权信息，调用时写作?copyright;<br>完整的例子如下，你可以copy下来存为copyright.xml观看实例：<br>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="GB2312"?&gt;<br>&lt;!DOCTYPE&nbsp;copyright&nbsp;[<br>&lt;!ENTITY&nbsp;copyright&nbsp;"Copyright&nbsp;2001,&nbsp;Ajie.&nbsp;All&nbsp;rights&nbsp;reserved"&gt;<br>]&gt;<br>&lt;myfile&gt;<br>&lt;title&gt;XML&lt;/title&gt;<br>&lt;author&gt;ajie&lt;/author&gt;<br>&lt;email&gt;ajie@aolhoo.com&lt;/email&gt;<br>&lt;date&gt;20010115&lt;/date&gt;<br>&#169;right;<br>&lt;/myfile&gt;&nbsp;<br><br><br><br>七.DTD的语法&nbsp;<br><br>DTD是"有效XML文档"的必须文件，我们通过DTD文件来定义文档中元素和标识的规则及相互关系。如何建立一个DTD文件呢？让我们一起来学习：&nbsp;<br><br>1.设置元素&nbsp;<br><br>元素是XML文档的基本组成部分。你要在DTD中定义一个元素，然后在XML文档中使用。元素的定义语法为：&lt;!ELEMENT&nbsp;DESCRIPTION&nbsp;(#PCDATA,&nbsp;DEFINITION)*&gt;&nbsp;<br><br>说明：&nbsp;<br><br>"&lt;!ELEMENT"&nbsp;是元素的声明，说明你要定义的是一个元素；&nbsp;<br><br>声明后面的"DESCRIPTION",是元素的名称；&nbsp;<br><br>"(#PCDATA,&nbsp;DEFINITION)*&gt;"则是该元素的使用规则。规则定义了元素可以包含的内容以及相互的关系。下面的表格概要列出了元素的规则：&nbsp;<br><br>2.元素规则表:&nbsp;<br><br><br>Symbol<br>含义<br>举例<br>#PCDATA<br><br>包含字符或文本数据<br>&lt;MYFILE(#PCDATA)&gt;<br>元素MYFILE包含一个文本数据<br>#PCDATA,&nbsp;element-name&nbsp;<br>包含文本和其它子元素<br>&lt;MYFILE(#PCDTATA,TITLE)&gt;<br>MYFILE元素必须包含文本和TITLE子元素<br>,<br><br>使用逗号分隔排序<br>&lt;MYFILE&nbsp;(TITLE,AUTHOR,EMAIL)&gt;<br>MYFILE元素必须依次包含TITILE,AUTHOR,EMAIL三个子元素<br>|<br>使用"|"表示或者<br>&lt;MYFILE&nbsp;(TITLE&nbsp;|&nbsp;AUTHOR&nbsp;|&nbsp;EMAIL)&gt;<br>MYFILE元素必须包含TITLE，或者AUTHOR或者EMAIL子元素。<br>name<br>只能使用一次<br>&lt;MYFILE&nbsp;(TITLE)&gt;<br>MYFILE元素必须包含TITLE子元素，而且只能使用一次。<br>name?<br><br>使用一次或者不使用<br>&lt;MYFILE&nbsp;(TITLE,AUTHOR?,EMAIL?)&gt;<br>MYFILE元素必须包含TITLE子元素，而且只能使用一次；可以包含或者不包含AUTHOR和EMAIL子元素，但是如果使用，只能一次。<br>name&nbsp;<br><br>使用至少一次或多次<br>&lt;MYFILE&nbsp;(TITLE&nbsp;,AUTHOR?,EMAIL)&gt;<br>MYFILE元素必须包含TITLE子元素，而且使用至少一次；接下来可以跟随AUTHOR子元素，也可以不跟；最后必须包含EMAIL子元素，而且只能使用一次。<br>name*<br><br>使用一次，多次，或者根本不使用<br>&lt;MYFILE&nbsp;(TITLE*)&gt;<br>MYFILE元素可以包含一个，多个或者不包含TITLE子元素<br>(&nbsp;)<br><br>设置组，可以嵌套<br>&lt;MYFILE(#PCDATA&nbsp;|&nbsp;TITLE)*&gt;<br>元素MYFILE包含一个或者更多的文本或者TITLE子元素。<br>&lt;MYFILE((TITLE*,&nbsp;AUTHOR?,&nbsp;EMAIL)*&nbsp;|&nbsp;COMMENT)&gt;<br>MYFILE元素必须包含一些内容，内容或者是一个注释；也或者是多个组，组里包含：一个，多个或者没有TITLE子元素，接着是一个或者没有AUTHOR子元素，再接着是一个必须的EMAIL子元素。<br><br><br>另外，我们还可以为元素定义属性，因为我们不推荐使用属性，在这里就不详细展开了。<br><br>　最后，我们来总结一些前四章学习的内容，写一个包含DTD，XML，以及Script的简单实例，便于读者理解：<br>1.将下面文件存为myfile.dtd<br>&lt;!ELEMENT&nbsp;myfile&nbsp;(title,&nbsp;author)&gt;<br>&lt;!ELEMENT&nbsp;title&nbsp;(#PCDATA)&gt;<br>&lt;!ELEMENT&nbsp;author&nbsp;(#PCDATA)&gt;<br><br>2.然后建立XML文档myfile.xml:<br>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="GB2312"?&gt;<br>&lt;!DOCTYPE&nbsp;myfile&nbsp;SYSTEM&nbsp;"myfile.dtd"&gt;<br>&lt;myfile&gt;<br>&lt;title&gt;XML轻松学习手册&lt;/title&gt;<br>&lt;author&gt;ajie&lt;/author&gt;<br>&lt;/myfile&gt;<br><br>3.建立HTML文档myfile.html<br>&lt;html&gt;<br>&lt;head&gt;<br>&lt;script&nbsp;language="JavaScript"&nbsp;for="window"&nbsp;event="onload"&gt;<br>var&nbsp;xmlDoc&nbsp;=&nbsp;new&nbsp;ActiveXObject("Microsoft.XMLDOM");<br>xmlDoc.async="false";<br>xmlDoc.load("myfile.xml");<br>nodes&nbsp;=&nbsp;xmlDoc.documentElement.childNodes;<br>title.innerText&nbsp;=&nbsp;nodes.item(0).text;<br>author.innerText&nbsp;=&nbsp;nodes.item(1).text;<br>&lt;/script&gt;<br>&lt;title&gt;在HTML中调用XML数据&lt;/title&gt;<br>&lt;/head&gt;<br>&lt;body&nbsp;bgcolor="#FFFFFF"&gt;<br>&lt;b&gt;标题:&nbsp;&lt;/b&gt;<br>&lt;span&nbsp;id="title"&gt;&lt;/span&gt;&lt;br&gt;<br>&lt;b&gt;作者:&nbsp;&lt;/b&gt;<br>&lt;span&nbsp;id="author"&gt;&lt;/span&gt;&lt;br&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;</font><br>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/120255.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-05-27 10:24 <a href="http://www.blogjava.net/WshmAndLily/articles/120255.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>