﻿<?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-金家寶-文章分类-其他辅助技术</title><link>http://www.blogjava.net/jiabao/category/20483.html</link><description>机会只会给垂青有准备的人，运气不是每个人都有的 ...</description><language>zh-cn</language><lastBuildDate>Mon, 26 Mar 2007 10:58:14 GMT</lastBuildDate><pubDate>Mon, 26 Mar 2007 10:58:14 GMT</pubDate><ttl>60</ttl><item><title>mysql常识和基本操作</title><link>http://www.blogjava.net/jiabao/articles/106178.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Sun, 25 Mar 2007 02:09:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/articles/106178.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/106178.html</wfw:comment><comments>http://www.blogjava.net/jiabao/articles/106178.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/106178.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/106178.html</trackback:ping><description><![CDATA[
		<p>　　<strong>【IT168 服务器学院】</strong>字段类型  <br />　　 1．INT[(M)]  </p>
		<p>　　 正常大小整数类型 </p>
		<p>　　 2．DOUBLE[(M,D)] [ZEROFILL]  </p>
		<p>　　 正常大小(双精密)浮点数字类型 </p>
		<p>　　 3．DATE  </p>
		<p>　　 日期类型。支持的范围是'1000-01-01'到'9999-12-31'。MySQL以'YYYY-MM-DD'格式来显示DATE值，但是允许你使用字符串或数字把值赋给DATE列 </p>
		<p>　　 4．CHAR(M)  </p>
		<p>　　 定长字符串类型，当存储时，总是是用空格填满右边到指定的长度 </p>
		<p>　　 5．BLOB TEXT  </p>
		<p>　　 BLOB或TEXT类型，最大长度为65535(2^16-1)个字符。 </p>
		<p>　　 6．VARCHAR </p>
		<p>　　 变长字符串类型。  </p>
		<p>　　 1: 显示数据库  <br />　  <br />　　 SHOW DATABAS，  </p>
		<p>　　 2：当前选择的数据库，  </p>
		<p>　　 mysql&gt; SELECT DATABASE();  <br />　　 +------------+  <br />　　 | DATABASE() |  <br />　　 +------------+  <br />　　 | test　;  <br />　　 +------------+  <br />　　 | DATABASE() |  <br />　　 +------------+  <br />　　 | test　　　 |  <br />　　 +------------+  </p>
		<p>　　 当前数据库包含的表信息：  </p>
		<p>　　 mysql&gt; SHOW TABLES;  <br />　　 +---------------------+  <br />　　 | Tables in test　  <br />　　 mysql&gt; SHOW TABLES;  <br />　　 +---------------------+  <br />　　 | Tables in test　　　|  <br />　　 +---------------------+  <br />　　 | mytable1　　　　　　|  <br />　　 | mytable2　　　　　　|  <br />　　 +---------------------+  </p>
		<p>　　 获取表结构  </p>
		<p>　　 mysql&gt; desc mytable1;  <br />　　 +---------+-------------+------+-----+---------+-------+  <br />　　 | Field　 mysql&gt; desc mytable1;  <br />　　 +---------+-------------+------+-----+---------+-------+  <br />　　 | Field　 | Type　　| Null | Key | Default | Extra |  <br />　　 +---------+-------------+------+-----+---------+-------+  <br />　　 | s1　　| varchar(20) | YES　|NULL　　|　　　 |  <br />　　 +---------------------+------+-----+---------+-------+  </p>
		<p> </p>
		<p>　　 5.导入数据库表  <br />　　 （1）创建.sql文件 </p>
		<p>　　 （2）先产生一个库如auction.c:mysqlbin&gt;mysqladmin -u root -p creat auction，会提示输入密码，然后成功创建。 </p>
		<p>　　 （2）导入auction.sql文件 </p>
		<p>　　 c:mysqlbin&gt;mysql -u root -p auction &lt; auction.sql。 </p>
		<p>　　 通过以上操作，就可以创建了一个数据库auction以及其中的一个表auction。 </p>
		<p>　　 6．修改数据库 </p>
		<p>　　 （1）在mysql的表中增加字段： </p>
		<p>　　 alter table dbname add column userid int(11) not null primary key auto_increment; </p>
		<p>　　 这样，就在表dbname中添加了一个字段userid，类型为int(11)。 </p>
		<p>　　 7．mysql数据库的授权 </p>
		<p>　　 mysql&gt;grant select,insert,delete,create,drop </p>
		<p>　　 on *.* (或test.*/user.*/..) </p>
		<p>　　 to 用户名@localhost </p>
		<p>　　 identified by '密码'； </p>
		<p>　　 如：新建一个用户帐号以便可以访问数据库，需要进行如下操作： </p>
		<p>　　 mysql&gt; grant usage </p>
		<p>　　 -&gt; ON test.* <br />　　 -&gt; TO <a class="10" href="mailto:testuser@localhost">testuser@localhost</a>; <br />　　 Query OK, 0 rows affected (0.15 sec) </p>
		<p>　　 此后就创建了一个新用户叫：testuser，这个用户只能从localhost连接到数据库并可以连接到test 数据库。下一步，我们必须指定testuser这个用户可以执行哪些操作： </p>
		<p>　　 mysql&gt; GRANT select, insert, delete,update <br />　　 -&gt; ON test.* <br />　　 -&gt; TO <a class="10" href="mailto:testuser@localhost">testuser@localhost</a>; <br />　　 Query OK, 0 rows affected (0.00 sec) </p>
		<p>　　 此操作使testuser能够在每一个test数据库中的表执行SELECT，INSERT和DELETE以及UPDATE查询操作。现在我们结束操作并退出MySQL客户程序： </p>
		<p>　　 mysql&gt; exit <br />　　 Bye  </p>
<img src ="http://www.blogjava.net/jiabao/aggbug/106178.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2007-03-25 10:09 <a href="http://www.blogjava.net/jiabao/articles/106178.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java更新XML的四种常用方法</title><link>http://www.blogjava.net/jiabao/articles/102716.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Thu, 08 Mar 2007 17:49:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/articles/102716.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/102716.html</wfw:comment><comments>http://www.blogjava.net/jiabao/articles/102716.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/102716.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/102716.html</trackback:ping><description><![CDATA[
		<p>本文简要的讨论了Java语言编程中更新XML文档的四种常用方法,并且分析这四种方法的优劣。其次,本文还对如何控制Java程序输出的XML文档的<a class="bluekey" href="http://www.yesky.com/key/3236/193236.html" target="_blank"><font color="#345588"><u>格式</u></font></a>做了展开论述。<br /><br />　　JAXP是Java API for XML Processing的英文字头缩写,中文含义是:用于XML文档处理的使用Java语言<a class="bluekey" href="http://www.yesky.com/key/4285/189285.html" target="_blank"><font color="#345588"><u>编写</u></font></a>的编程接口。JAXP支持DOM、SAX、XSLT等标准。为了增强JAXP使用上的灵活性,开发者特别为JAXP设计了一个Pluggability Layer,在Pluggability Layer的支持之下,JAXP既可以和具体实现DOM API、SAX API 的各种XML解析器(XML Parser,例如Apache Xerces)联合工作,又可以和具体执行XSLT标准的XSLT处理器(XSLT Processor,例如Apache Xalan)联合工作。应用Pluggability Layer的好处在于:我们只需要<a class="bluekey" href="http://www.yesky.com/key/1843/191843.html" target="_blank"><font color="#345588"><u>熟悉</u></font></a>JAXP各个编程接口的定义即可,而不需要对所采用的具体的XML解析器、XSLT处理器有很深入的了解。比如在某个Java程序中,通过JAXP调用XML解析器Apache Crimson对XML文档进行处理,如果我们希望使用别的XML解析器(比如Apache Xerces),以便提高该程序的性能,那么原程序代码可能不需要任何改变,直接就可以使用(你所需要做的事情只是将包含Apache Xerces代码的jar文件加入到环境变量CLASSPATH中,而将包含Apache Crimson代码的jar文件在环境变量CLASSPATH中删除)。 <br /><br />　　目前JAXP已经应用的十分普遍了,可以说是Java语言中处理XML文档的标准API。有些初学者在学习使用JAXP的过程中,经常会提出这样的问题:我编写的程序对DOM Tree做了更新,但是当程序退出以后,原始的XML文档并没有改变,还是老样子,<a class="bluekey" href="http://www.yesky.com/key/1497/181497.html" target="_blank"><font color="#345588"><u>如何实现</u></font></a>对原始XML文档和DOM Tree的同步更新呢?咋一看来,在JAXP中似乎没有提供相应的接口/方法/类,这是很多初学者都感到困惑的问题。本文的主旨就在于解决这个问题,简单的介绍几种常用的同步更新原始XML文档和DOM Tree的方法。为了缩小讨论的范围,本文所涉及的XML解析器仅包括Apache Crimson和Apache Xerces,而XSLT处理器仅仅使用Apache Xalan。 <br /><br />　　方法一:直接读写XML文档 <br /><br />　　这也许是最笨最原始的办法了。当程序<a class="bluekey" href="http://www.yesky.com/key/2892/187892.html" target="_blank"><font color="#345588"><u>获取</u></font></a>DOM Tree之后,应用DOM模型的Node接口的各个方法对DOM Tree进行更新,下一步应该对原始的XML文档进行更新了。我们可以运用递归的办法或者是应用TreeWalker类,遍历整个DOM Tree,与此同时,将DOM Tree的每一个节点/元素依次写入到预先打开的原始XML文档中,当DOM Tree被遍历完全之后,DOM Tree和原始的XML文档就实现了同步更新。实际中,这个方法极少使用,不过如果你要编程实现自己的XML解析器,这种方法还是有可能用得上的。 <br />方法二:使用XmlDocument类 <br /><br />　　使用XmlDocument类?JAXP中分明没有这个类呀!是不是作者搞错了?没有错!就是使用XmlDocument类,确切的说,是使用XmlDocument类的write()方法。 <br /><br />　　在上文已经提到过,JAXP可以和各种各样的XML解析器联合使用,这次我们选用的XML解析器是Apache Crimson。XmlDocument(org.apache.crimson.tree.XmlDocument)是Apache Crimson的一个类,并不包含于标准的JAXP中,难怪在JAXP的文档中找不到XmlDocument类的芳踪呢。现在问题出来了,如何应用XmlDocument类来实现更新XML文档的功能?在XmlDocument类中提供了下面三个write()方法(根据Crimson最新的版本------Apache Crimson 1.1.3): <br /><br /><br />　　上述三个write()方法的主要作用就是输出DOM Tree中的内容到特定的输出介质中,比如文件输出流、应用程序控制台等等。那么又如何使用上述三个write()方法呢?请看下面的Java程序代码片断: <br /><br /></p>
		<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
				<tbody>
						<tr>
								<td>String name="fancy";<br />DocumentBuilder parser;<br />DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();<br />try <br />{<br />parser = factory.newDocumentBuilder();<br />Document doc = parser.parse("user.xml");<br />Element newlink=doc.createElement(name);<br />doc.getDocumentElement().appendChild(newlink);<br />((XmlDocument)doc).write(new FileOutputStream(new File("xuser1.xml")));<br />}<br />catch (Exception e) <br />{<br />//to log it <br />}</td>
						</tr>
				</tbody>
		</table>
		<br />　　在上面的代码中,首先创建了一个Document对象doc,获取完整的DOM Tree,然后应用Node接口的appendChild()方法,在DOM Tree的最后追加了一个新节点(fancy),最后调用XmlDocument类的write(OutputStream out)方法,把DOM Tree中的内容输出到xuser.xml中(其实也可以输出到user.xml,更新原始的XML文档,在这里为了便于做对比,故而输出到xuser.xml文件中)。需要注意的是不能直接对Document对象doc直接调用write()方法,因为JAXP的Document接口并没有定义任何write()方法,所以必须将doc由Document对象强制转换为XmlDocument对象,然后才能调用write()方法,在上面的代码中使用的是write(OutputStream out)方法,这个方法使用缺省的UTF-8编码输出DOM Tree中的内容到特定的输出介质中,如果DOM Tree中包含中文字符,那么输出的结果有可能是乱码,亦即存在所谓的"汉字问题",解决的办法是使用write (Writer out, String encoding)方法,显式指定输出时的编码,例如将第二个参数设为"GB2312",这时即不存在"汉字问题",输出结果能够正常显示中文字符。 <br /><br />　　完整的例子请参考下列文件: AddRecord.java(见附件)、user.xml(见附件)。该例子的运行环境为:Windows XP Professional、JDK 1.3.1。为了能够正常编译运行AddRecord.java这个程序,你需要到网址http://xml.apache.org/dist/crimson/去下载Apache Crimson,并将所获取的crimson.jar文件加入到环境变量CLASSPATH中。 <br /><br />　　注意: <br /><br />　　Apache Crimson的前身是Sun Project X Parser,后来不知何故,由X Parser演变为Apache Crimson,至今Apache Crimson的很多代码都是从X Parser中直接移植过来的。比如上文用到的XmlDocument类,它在X Parser中是com.sun.xml.XmlDocument,到了Apache Crimson中摇身一变,就变成了org.apache.crimson.tree.XmlDocument类,其实它们的绝大部分代码是一样的,可能就package语句和import语句以及文件开头的一段lience有所不同而已。早期的JAXP是和X Parser捆绑在一起的,因此一些老的程序使用了com.sun.xml包,如果你现在重新编译它们,有可能不能通过,肯定就是因为这个原因。后来的JAXP和Apache Crimson捆绑在一起,比如JAXP 1.1,如果你使用JAXP 1.1,那么不需要额外下载Apache Crimson,也能够正常编译运行上面的例子(AddRecord.java)。最新的JAXP 1.2 EA(Early Access)改弦更张,采用性能更好的Apache Xalan和Apache Xerces分别作为XSLT处理器和XML解析器,不能直接支持Apache Crimson了,所以如果你的开发环境采用了JAXP 1.2 EA或者是Java XML Pack(内含JAXP 1.2 EA),那么将无法直接编译运行上面的例子(AddRecord.java),你需要额外下载并安装Apache Crimson。 <br />方法三:使用TransformerFactory和Transformer类 <br /><br />　　在JAXP中所提供的标准的更新原始XML文档的方法就是调用XSLT引擎,亦即使用TransformerFactory和Transformer类。请看下面的Java代码片断: <br /><br /><br />　　在实际的应用中,我们可以应用传统的DOM API从XML文档中获取DOM Tree,然后根据实际的需求对DOM Tree执行各种操作,得到最终的Document对象,接下来可以由此Document对象创建DOMSource对象,剩下的事情就是照搬上面的代码了,程序运行完毕后, XMLOutput.xml就是你所需要的结果(当然了,你可以随意更改StreamResult类构造函数的参数,指定不同的输出介质,而不必是千篇一律的XML文档)。 <br /><br />　　这个方法最大的好处在于可以随心所欲的控制DOM Tree中的内容输出到输出介质中的格式,但是光靠TransformerFactory类和Transformer类并不能实现这个功能,还需要依赖OutputKeys类的帮助。 完整的例子请参考下列文件: AddRecord2.java(见附件)、user.xml(见附件)。该例子的运行环境为:Windows XP Professional、JDK 1.3.1。为了能够正常编译运行AddRecord2.java这个程序,你需要到网址http://java.sun.com去下载安装JAXP 1.1或者Java XML Pack(Java XML Pack已经内含JAXP了)。 <br /><br />　　OutputKeys类 <br /><br />　　javax.xml.transform.OutputKeys类和java.util.Properties类配合使用,可以控制JAXP的XSLT引擎(Transformer类)输出XML文档的格式。请看下面的代码片断: <br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"><tbody><tr><td>//首先创建一个TransformerFactory对象,再由此创建Transformer对象。<br />TransformerFactory tf=TransformerFactory.newInstance(); <br />Transformer t=tf.newTransformer ();<br /><br />//获取Transformser对象的输出属性,亦即XSLT引擎的缺省输出属性,这是一个<br />//java.util.Properties对象。<br />Properties properties = t.getOutputProperties(); <br /><br />//设置新的输出属性:输出字符编码为GB2312,这样可以支持中文字符,XSLT引擎所输出<br />//的XML文档如果包含了中文字符,可以正常显示,不会出现所谓的"汉字问题"。<br />//请留意OutputKeys类的字符串常数OutputKeys.ENCODING。<br />properties.setProperty(OutputKeys.ENCODING,"GB2312"); <br /><br />/更新XSLT引擎的输出属性。<br />t.setOutputProperties(properties); <br /><br />//调用XSLT引擎,按照输出属性中的设置,输出DOM Tree中的内容到输出介质中。<br />t.transform(DOMSource_Object,StreamResult_Object); </td></tr></tbody></table><br />　　从上面的程序代码,我们不难看出,通过设置XSLT引擎(Transformer类)的输出属性,可以控制DOM Tree中的内容的输出格式,这对于我们定制输出内容是很有帮助的。那么JAXP的XSLT引擎(Transformer类)有那些输出属性可以设置呢? javax.xml.transform.OutputKeys类定义了很多字符串常数,它们都是可以自由设置的输出属性,常用的输出属性如下所示: <br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"><tbody><tr><td>public static final java.lang.String METHOD </td></tr></tbody></table><br />　　可以设为"xml"、"html"、"text"等值。 <br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"><tbody><tr><td>public static final java.lang.String VERSION</td></tr></tbody></table><br />　　所遵循规范的版本号,如果METHOD设为"xml",那么它的值应该设为"1.0",如果METHOD设为"html",那么它的值应该设为"4.0",如果METHOD设为"text",那么这个输出属性会被忽略。 <br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"><tbody><tr><td>public static final java.lang.String ENCODING </td></tr></tbody></table><br />　　设置输出时所采用的编码方式,比如"GB2312"、"UTF-8"等等,如果将其设置为"GB2312",可以解决所谓的"汉字问题"。 <br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"><tbody><tr><td>public static final java.lang.String OMIT_XML_DECLARATION</td></tr></tbody></table><br />　　设置输出到XML文档中时是否忽略XML声明,亦即类似于: <br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"><tbody><tr><td>＜?xml version="1.0" standalone="yes" encoding="utf-8" ?＞ </td></tr></tbody></table><br />　　这样的代码。它可选的值有"yes"、"no"。 <br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"><tbody><tr><td>public static final java.lang.String INDENT</td></tr></tbody></table><br />　　IDENT设定XSLT引擎在输出XML文档时,是否自动添加额外的空格,它可选的值为"yes"、"no"。 <br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"><tbody><tr><td>public static final java.lang.String MEDIA_TYPE </td></tr></tbody></table><br />　　MEDIA_TYPE设定输出文档的MIME类型。 <br /><br />　　如果设定XSLT引擎的输出属性呢?下面我们来总结一下: <br /><br />　　首先是获取XSLT引擎(Transformer类)的缺省输出属性的集合,这需要使用Transformer类的getOutputProperties()方法,返回值是一个java.util.Properties对象。 <br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"><tbody><tr><td>Properties properties = transformer.getOutputProperties();</td></tr></tbody></table><br />　　然后是设定新的输出属性,比如: <br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"><tbody><tr><td>properties.setProperty(OutputKeys.ENCODING,"GB2312");<br />properties.setProperty(OutputKeys.METHOD,"html");<br />properties.setProperty(OutputKeys.VERSION,"4.0");<br />……………………………………………………… </td></tr></tbody></table><p><br />　　最后是更新XSLT引擎(Transformer类)的缺省输出属性的集合,这需要使用Transformer类的setOutputProperties()方法,参数是一个java.util.Properties对象。 <br /><br />　　我们编写了一个新的程序,其中应用了OutputKeys类,用以控制XSLT引擎的输出属性,该程序的架构和前一个程序(AddRecord3.java)大致相同,不过输出结果略有不同。完整的代码请参考下列文件: AddRecord3.java(见附件)、user.xml(见附件)。该例子的运行环境为:Windows XP Professional、JDK 1.3.1。为了能够正常编译运行AddRecord3.java这个程序,你需要到网址http://java.sun.com去下载安装JAXP 1.1或者Java XML Pack(Java XML Pack内含JAXP了)。</p><p>方法四:使用Xalan XML Serializer <br /><br />　　方法四其实是方法三的一个变种,它需要Apache Xalan和Apache Xerces的支持才能够运行。例子代码如下所示: <br /><br /><br />　　这个方法不太常用,而且似乎有点画蛇添足,所以我们就不展开讨论了。完整的例子请参考下列文件: AddRecord4.java(见附件)、user.xml(见附件)。该例子的运行环境为:Windows XP Professional、JDK 1.3.1。为了能够正常编译运行AddRecord4.java这个程序,你需要到网址http://xml.apache.org/dist/去下载安装Apache Xalan和Apache Xerces。 <br /><br />　　或者是到网址http://java.sun.com/xml/download.html去下载安装Java XML Pack。因为最新的Java XML Pack(Winter 01 版)包含了Apache Xalan和Apache Xerces技术在内。 <br /><br />　　结论: <br /><br />　　本文简略的讨论了Java语言编程中更新XML文档的四种方法。第一种方法是直接读写XML文件,这种方法十分繁琐,而且比较容易出错,极少使用,除非你需要开发自己的XML Parser,否则不会使用这种方法。第二种方法是使用Apache Crimson的XmlDocument类,这种方法极为简单,使用方便,如果你选用Apache Crimson作为XML解析器,那么不妨使用这种方法,不过这种方法似乎效率不高(源于效率低下的Apache Crimson),另外,高版本的JAXP或者是Java XML Pack、JWSDP不直接支持Apache Crimson,亦即这种方法不通用。第三种方法是使用JAXP的XSLT引擎(Transformer类)来输出XML文档,这种方法也许是标准的方法了,使用起来十分灵活,特别是可以自如控制输出格式,我们推荐采用这种方法。第四种方法是第三种方法的变种,采用了Xalan XML Serializer,引入了串行化操作,对于大量文档的修改/输出有优越性,可惜的是要重复设置XSLT引擎的属性和XML Serializer的输出属性,比较麻烦,而且依赖于Apache Xalan和Apache Xerces技术,通用性略显不足。 <br /><br />　　除了上面讨论的四种方法以外,实际上应用别的API(比如JDOM、Castor、XML4J、Oracle XML Parser V2)也有很多办法可以更新XML文档,限于篇幅,在这里就不一一讨论了。 <br /></p><img src ="http://www.blogjava.net/jiabao/aggbug/102716.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2007-03-09 01:49 <a href="http://www.blogjava.net/jiabao/articles/102716.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简析JAVA的XML编程</title><link>http://www.blogjava.net/jiabao/articles/102711.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Thu, 08 Mar 2007 17:25:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/articles/102711.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/102711.html</wfw:comment><comments>http://www.blogjava.net/jiabao/articles/102711.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/102711.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/102711.html</trackback:ping><description><![CDATA[XML作为全球通用的结构化语言，越来越受人们青睐，各种开发平台（比如Microsoft Studio系列、Oracle系列、Inprise Borland系列等）也都把支持XML开发作为宣传口号之一。由于笔者所从事的电子政务开发较早的引入了XML,所以尝到了许多甜头，在许多项目中利用XML数据交换信息，省去了许多麻烦事，不用制定繁锁的数据格式，利用XML数据易于表达，也利于一线开发者跟踪调试。 
<p>笔者先前也曾发表过相关的文章，比如《简析Delphi中的XML编程》一文，有兴趣的读者可以到Google网（http: //www.google.com）去搜索一下，有很多媒体转载。今天笔者想探讨的是关于JAVA中的XML编程，希望对正在或想要学习XML编程的新老读者有所帮助。 </p><p>在XML应用中，最常用也最实用的莫过于XML文件的读写，所以笔者通过一个简单的XML文件读写来作简要分析。可以在任何文本编辑器中先建立如下结构的 XML文件，类似于HTML结构，但XML语义比较严格，起始标记必须配对，比如"〈学生花名册〉"与"〈／学生花名册〉"对应，空格多少可不必在意，但一般都以缩格形式书写，便于阅读。把此文件命名为Input.xml，可以在任何支持XML的浏览器中打开测试一下，如果输入正确，在浏览中可以看到此文件的树形表示结构。如果您还对XML结构感到比较陌生，建议先看看《简析Delphi中的XML编程》一文中关于XML文件的说明。 <br />&lt;?xml version="1.0" encoding="GB2312"?&gt; <br />&lt;学生花名册&gt; <br />&lt;学生 性别 = "男"&gt; <br />&lt;姓名&gt;李华&lt;/姓名&gt; <br />&lt;年龄&gt;14&lt;/年龄&gt; <br />&lt;电话&gt;6287555&lt;/电话&gt; <br />&lt;/学生&gt; <br />&lt;学生 性别 = "男"&gt; <br />&lt;姓名&gt;张三&lt;/姓名&gt; <br />&lt;年龄&gt;16&lt;/年龄&gt; <br />&lt;电话&gt;8273425&lt;/电话&gt; <br />&lt;/学生&gt; <br />&lt;/学生花名册&gt; </p><p>准备工作做完后，接着就开始写实质性的JAVA代码了。为保存从XML文件读入的信息，需要先建一个简单的Bean来保存学生信息，命名为StudentBean，代码如下所示： <br />public class StudentBean { <br />private String sex; //学生性别 <br />private String name; //学生姓名 <br />private int age; //学生年龄 <br />private String phone; //电话号码 </p><p>public void setSex(String s) { <br />sex = s; <br />} <br />public void setName(String s) { <br />name = s; <br />} <br />public void setAge(int a) { <br />age = a; <br />} <br />public void setPhone(String s) { <br />phone = s; <br />} <br />public String getSex() { <br />return sex; <br />} <br />public String getName() { <br />return name; <br />} <br />public int getAge() { <br />return age; <br />} <br />public String getPhone() { <br />return phone; <br />} <br />} </p><p>之后写XML的测试类，笔者把这个类命名为XMLTest，为了读写XML文件，需要导入如下JAVA包，"//"后为注释说明，笔者的环境是JDK 1.3.1_04，在JDK 1.4.0中测试也通过，XML解释器用Apache的Crimson，可以到Apache主页去上载。 <br />import java.io.*; //Java基础包，包含各种IO操作 <br />import java.util.*; //Java基础包，包含各种标准数据结构操作 <br />import javax.xml.parsers.*; //XML解析器接口 <br />import org.w3c.dom.*; //XML的DOM实现 <br />import org.apache.crimson.tree.XmlDocument;//写XML文件要用到 </p><p>为了保存多个学生信息，还得借助一个集合类(并不是单纯意义上的集合，JAVA中的集合是集合框架的概念，包含向量、列表、哈希表等），这里采用 Vector向量类。定义在XMLTest测试类中，命名为student_Vector。然后定义两个方法readXMLFile和 writeXMLFile，实现读写操作。代码如下： <br />private void readXMLFile(String inFile) throws Exception { <br />//为解析XML作准备，创建DocumentBuilderFactory实例,指定DocumentBuilder <br />DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); <br />DocumentBuilder db = null; <br />try { <br />db = dbf.newDocumentBuilder(); <br />} catch (ParserConfigurationException pce) { <br />System.err.println(pce); //出异常时输出异常信息，然后退出，下同 <br />System.exit(1); <br />} </p><p>Document doc = null; <br />try { <br />doc = db.parse(inFile); <br />} catch (DOMException dom) { <br />System.err.println(dom.getMessage()); <br />System.exit(1); <br />} catch (IOException ioe) { <br />System.err.println(ioe); <br />System.exit(1); <br />} <br />//下面是解析XML的全过程，比较简单，先取根元素"学生花名册" <br />Element root = doc.getDocumentElement(); <br />//取"学生"元素列表 <br />NodeList students = root.getElementsByTagName("学生"); <br />for (int i = 0; i &lt; students.getLength(); i++) { <br />//依次取每个"学生"元素 <br />Element student = (Element) students.item(i); <br />//创建一个学生的Bean实例 <br />StudentBean studentBean = new StudentBean(); <br />//取学生的性别属性 <br />studentBean.setSex(student.getAttribute("性别")); <br />//取"姓名"元素，下面类同 <br />NodeList names = student.getElementsByTagName("姓名"); <br />if (names.getLength() == 1) { <br />Element e = (Element) names.item(0); <br />Text t = (Text) e.getFirstChild(); <br />studentBean.setName(t.getNodeValue()); <br />} </p><p>NodeList ages = student.getElementsByTagName("年龄"); <br />if (ages.getLength() == 1) { <br />Element e = (Element) ages.item(0); <br />Text t = (Text) e.getFirstChild(); <br />studentBean.setAge(Integer.parseInt(t.getNodeValue())); <br />} </p><p>NodeList phones = student.getElementsByTagName("电话"); <br />if (phones.getLength() == 1) { <br />Element e = (Element) phones.item(0); <br />Text t = (Text) e.getFirstChild(); <br />studentBean.setPhone(t.getNodeValue()); <br />} </p><p>student_Vector.add(studentBean); <br />} <br />} </p><p>private void writeXMLFile(String outFile) throws Exception { <br />//为解析XML作准备，创建DocumentBuilderFactory实例,指定DocumentBuilder <br />DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); <br />DocumentBuilder db = null; <br />try { <br />db = dbf.newDocumentBuilder(); <br />} catch (ParserConfigurationException pce) { <br />System.err.println(pce); <br />System.exit(1); <br />} </p><p>Document doc = null; <br />doc = db.newDocument(); </p><p>//下面是建立XML文档内容的过程，先建立根元素"学生花名册" <br />Element root = doc.createElement("学生花名册"); <br />//根元素添加上文档 <br />doc.appendChild(root); </p><p>//取学生信息的Bean列表 <br />for (int i = 0; i &lt; student_Vector.size(); i++) { <br />//依次取每个学生的信息 <br />StudentBean studentBean = (StudentBean) student_Vector.get(i); <br />//建立"学生"元素，添加到根元素 <br />Element student = doc.createElement("学生"); <br />student.setAttribute("性别", studentBean.getSex()); <br />root.appendChild(student); <br />//建立"姓名"元素，添加到学生下面，下同 <br />Element name = doc.createElement("姓名"); <br />student.appendChild(name); <br />Text tName = doc.createTextNode(studentBean.getName()); <br />name.appendChild(tName); </p><p>Element age = doc.createElement("年龄"); <br />student.appendChild(age); <br />Text tAge = doc.createTextNode(String.valueOf(studentBean.getAge())); <br />age.appendChild(tAge); </p><p>Element phone = doc.createElement("电话"); <br />student.appendChild(phone); <br />Text tPhone = doc.createTextNode(studentBean.getPhone()); <br />phone.appendChild(tPhone); <br />} <br />//把XML文档输出到指定的文件 <br />FileOutputStream outStream = new FileOutputStream(outFile); <br />OutputStreamWriter outWriter = new OutputStreamWriter(outStream); <br />((XmlDocument) doc).write(outWriter, "GB2312"); <br />outWriter.close(); <br />outStream.close(); <br />} </p><p>最后加入测试主函数，如下： <br />public static void main(String[] args) throws Exception { <br />//建立测试实例 <br />XMLTest xmlTest = new XMLTest(); <br />//初始化向量列表 <br />xmlTest.student_Vector = new Vector(); </p><p>System.out.println("开始读Input.xml文件"); <br />xmlTest.readXMLFile("Input.xml"); </p><p>System.out.println("读入完毕,开始写Output.xml文件"); <br />xmlTest.writeXMLFile("Output.xml"); <br />System.out.println("写入完成"); <br />} </p><p>好了，保存好StudentBean和XMLTest，把Input.xml保存到工作目录下。如果您输入很仔细，没敲错字母的话，可以看到"写入完成"了，去瞧瞧Output.xml文件和Input.xml文件是不是一样吧。</p><img src ="http://www.blogjava.net/jiabao/aggbug/102711.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2007-03-09 01:25 <a href="http://www.blogjava.net/jiabao/articles/102711.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>