<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>lbh087</title>
    <description></description>
    <link>http://lbh087.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>java 汉字转化为全拼</title>
        <author>lbh087</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lbh087.javaeye.com">lbh087</a>&nbsp;
          链接：<a href="http://lbh087.javaeye.com/blog/206302" style="color:red;">http://lbh087.javaeye.com/blog/206302</a>&nbsp;
          发表时间: 2008年06月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          先根据<a href="http://ash.jp/code/cn/gb2312tbl.htm " target="_blank">http://ash.jp/code/cn/gb2312tbl.htm </a>表将所有的汉字编码转成十进制,如:有对应是:"129-74", "you",把所有的全放到一个map中.下面是代码:<br /><br /><pre name="code" class="java">
	private static LinkedHashMap spellMap = null;

	static {
		if (spellMap == null) {
			spellMap = new LinkedHashMap(20901);
		}
		initialize();
	}

	private static void initialize() {
         spellMap.put("129-74", "you");
         spellMap.put("129-99", "dou");
}
</pre><br /><br />先判断是不是GBK,接着	 int hightByte = 256 + bytes[0],找一个汉字对应的Ascii,最后和上面的我们准备好的map的key进行比较.<br />			<br /><pre name="code" class="java">
/**
	 * 获得单个汉字的Ascii，并用"-"连接成一个字符串
	 * 
	 * @param cn char 汉字字符
	 * @return string 错误返回 空字符串,否则返回ascii
	 */
	public static String getCnAscii(char cn) {
		byte[] bytes = null;
		try {
			bytes = (String.valueOf(cn)).getBytes("GBK");
		} catch (Exception ex) {
			bytes = (String.valueOf(cn)).getBytes();
		}
		
		if (bytes == null || bytes.length > 2 || bytes.length &lt;= 0) { // 错误
			return "";
		}
		if (bytes.length == 1) { // 英文字符
			return new String(bytes);
		}
		if (bytes.length == 2) { // 中文字符
			int hightByte = 256 + bytes[0];
			int lowByte = 256 + bytes[1];

			String ascii = hightByte + "-" + lowByte;

			return ascii;
		}

		return ""; // 错误
	}

	/**
	 * 根据ASCII码连接成的字符串到SpellMap中查找对应的拼音
	 * 
	 * @param ascii 字符对应的ASCII连接的字符串
	 * @return String 拼音,首先判断是否是中文如果是英文直接返回字符，如果是中文返回拼音,
	 * 
	 * 否则到SpellMap中查找,如果没有找到拼音,则返回null,如果找到则返回拼音.
	 */
	public static String getSpellByAscii(String ascii) {
		if (ascii.indexOf("-") > -1)
		{
			return (String)spellMap.get(ascii);
		} else {
			return ascii;
		}
	}

	/**
	 * 返回字符串的全拼,是汉字转化为全拼,其它字符不进行转换
	 * 
	 * @param cnStr String字符串
	 * @return String 转换成全拼后的字符串
	 */
	public static String getFullSpell(String cnStr)
	{
		if (null == cnStr || "".equals(cnStr.trim())) {
			return cnStr;
		}

		char[] chars = cnStr.toCharArray();
		StringBuffer retuBuf = new StringBuffer();
		for (int i = 0, Len = chars.length; i &lt; Len; i++) {
			String ascii = getCnAscii(chars[i]);
			if(log.isDebugEnabled()){
				log.debug("cnToSpell:"+chars[i]+":"+ascii);
			}
			if (ascii.length() == 0) { // 取ascii时出错
				retuBuf.append(chars[i]);
			} else {
				String spell = getSpellByAscii(ascii);
				if(log.isDebugEnabled()){
					log.debug("cnToSpell:"+ascii+":"+spell);
				}
				if (spell == null) {
					retuBuf.append(chars[i]);
				} else {
					retuBuf.append(spell);
				} // end of if spell == null
			} // end of if ascii &lt;= -20400
		} // end of for

		return retuBuf.toString();
	}

	/**
	 * 获取汉语字符串的声母组合，每个汉字取拼音的第一个字符组成的一个字符串
	 * @param cnStr 汉字的字符串
	 * @return 每个汉字拼音的第一个字母所组成的汉字
	 */
	public static String getFirstSpell(String cnStr)
	{
		if (null == cnStr || "".equals(cnStr.trim())) {
			return cnStr;
		}

		char[] chars = cnStr.toCharArray();
		StringBuffer retuBuf = new StringBuffer();

		String ascii = getCnAscii(chars[0]);
		if (ascii.length() == 1) { // 取ascii时出错
			retuBuf.append(chars[0]);
		} else {
			
			String spell = getSpellByAscii(ascii).substring(0, 1);
			if (spell == null) {
				retuBuf.append(chars[0]);
			} else {
				retuBuf.append(spell);
			} // end of if spell == null
		} // end of if ascii &lt;= -20400 
		
		return retuBuf.toString();
	}


</pre>
          <br/>
          <span style="color:red;">
            <a href="http://lbh087.javaeye.com/blog/206302#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 20 Jun 2008 15:06:20 +0800</pubDate>
        <link>http://lbh087.javaeye.com/blog/206302</link>
        <guid>http://lbh087.javaeye.com/blog/206302</guid>
      </item>
      <item>
        <title>opencms中自动发送email</title>
        <author>lbh087</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lbh087.javaeye.com">lbh087</a>&nbsp;
          链接：<a href="http://lbh087.javaeye.com/blog/200774" style="color:red;">http://lbh087.javaeye.com/blog/200774</a>&nbsp;
          发表时间: 2008年06月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          opencms的email是直接继承apache的email类.下面也一个发送html格式的email的列子,<br />其他类还可以发送比如带附件之类的email.<br /><pre name="code" class="java">
     CmsHtmlMail mail = new CmsHtmlMail();
     String password = user.getPassword();
     mail.setCharset("GBK"); 
     mail.setHtmlMsg("邮件内容");
     mail.setSubject("标题");
     mail.addTo(user.getEmail(),"");
     mail.setFrom("发送人的email地址","发送人的名字")
      mail.send();
</pre><br /><br />下面在opencms-system.xml进行配制.<br /><pre name="code" class="xml">
    &lt;mail>
      &lt;mailfrom>nobody11@nowhere.com&lt;/mailfrom>
      &lt;mailhost name="192.168.0.9" protocol="smtp" user="用户名" password="密码"/>
      &lt;mailhost name="alternative.smtp.server"/>
      &lt;mailhost name="another.alternative.smtp.server"/>
    &lt;/mail>
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://lbh087.javaeye.com/blog/200774#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 06 Jun 2008 09:37:38 +0800</pubDate>
        <link>http://lbh087.javaeye.com/blog/200774</link>
        <guid>http://lbh087.javaeye.com/blog/200774</guid>
      </item>
      <item>
        <title>session.flush机制(转)！！！</title>
        <author>lbh087</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lbh087.javaeye.com">lbh087</a>&nbsp;
          链接：<a href="http://lbh087.javaeye.com/blog/200756" style="color:red;">http://lbh087.javaeye.com/blog/200756</a>&nbsp;
          发表时间: 2008年06月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在下面的情况下，Hibernate会调用Session.flush()以清理缓存：<br />     1)事务提交时，如果flush模式不为FlushMode.NEVER,commit()将调用flush().<br />     2)在某些查询语句之前（<span style="color: red">此查询语句之前的语句已经改变了数据库状态，所以需要调用flush（）以同步数据库是查出来的数据是经过更改的</span>）。<br />在调用Session.flush()时，涉及的SQL语句会按照下面的顺序执行。<br />（1）         所有的实体经行插入的语句，其顺序按照对象执行Session.save()的时间顺序。<br />（2）         所有对实体经行更新的语句<br />（3）         所有经行集合的删除语句<br />（4）         所有对集合元素进行删除，更新或者插入的语句<br />（5）         所有经行集合插入的语句<br />（6）         所有对实体经行删除的语句，其顺序按照对象执行Session.delete()的时间顺序。<br />（7）         有一个例外是，如果对象使用native方式生成的ID（持久化标识），则他们一执行save就会被插入。<br />除非明确地指定了flush（）命令，否则关于Session何时会执行这些JDBC调用完全是无法保证的，只能保证他们执行的前后顺序。<br />通过设置session.setFlushMode(),可以精确控制Hibernate的FlushMode.<br />(1)                FlushMode.AUTO:Hibernate判断对象属性有没有改变，如果被更改成为脏数据，则在一个查询语句钱将更新此改动以保证数据库的同步。这也是Hibernate的默认清理模式。<br />(2)              FlushMode.COMMIT:在事务结束之前清理session的缓存。这样有可能导致查出脏数据<br />(3)                FlushMode.NEVER：除非强制调用Session.flush(),否则永远不清理Session。想当于将数据库设置为一个只读的数据库。<br />(4)                FlushMode.ALWAYS：在每一个查询数据之前都调用Session.flush()。很显然这种效率很低。<br />     只用当使用触发器，或把Hibernate和JDBC混合使用，直接调用Session.flush()才是有意义的。
          <br/>
          <span style="color:red;">
            <a href="http://lbh087.javaeye.com/blog/200756#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 06 Jun 2008 09:15:42 +0800</pubDate>
        <link>http://lbh087.javaeye.com/blog/200756</link>
        <guid>http://lbh087.javaeye.com/blog/200756</guid>
      </item>
      <item>
        <title>sql脚本传参数的方法</title>
        <author>lbh087</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lbh087.javaeye.com">lbh087</a>&nbsp;
          链接：<a href="http://lbh087.javaeye.com/blog/200559" style="color:red;">http://lbh087.javaeye.com/blog/200559</a>&nbsp;
          发表时间: 2008年06月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">
Query query = session.createQuery("select * from cat where id = ?");
query.setLong(0,1L);

Query query = session.createQuery("select * from cat where id = :id");
query.setLong("name",1L);

Query query = session.createQuery("select * from cat where id in (:idList)");
ArrayList&lt;Long> idList = new ArrayList();
idList.add(1L);
idList.add(2L);
query.setParameterList("idList",idList);

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://lbh087.javaeye.com/blog/200559#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 05 Jun 2008 16:17:51 +0800</pubDate>
        <link>http://lbh087.javaeye.com/blog/200559</link>
        <guid>http://lbh087.javaeye.com/blog/200559</guid>
      </item>
      <item>
        <title>inverse</title>
        <author>lbh087</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lbh087.javaeye.com">lbh087</a>&nbsp;
          链接：<a href="http://lbh087.javaeye.com/blog/200480" style="color:red;">http://lbh087.javaeye.com/blog/200480</a>&nbsp;
          发表时间: 2008年06月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="xml">
&lt;set name="linkmen" lazy="true" inverse="true" cascade="all">
			&lt;key column="agent_id" />
			&lt;one-to-many
				class="com.infowarelab.boss.persistence.model.AgentLinkman" />
		&lt;/set>

</pre><br /><br />inverse="true",表示把关系叫linkmen那边进行维护.但保存one时,也要保存many,就必须把many设到one中,一般情况都会设成true<br />如果不写,就表示两边都可以维护之间的关系(只要有一般做set就ok),但会有一些意想不到小问题(不但会保存一次,还会做一次update agent_id).
          <br/>
          <span style="color:red;">
            <a href="http://lbh087.javaeye.com/blog/200480#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 05 Jun 2008 13:18:35 +0800</pubDate>
        <link>http://lbh087.javaeye.com/blog/200480</link>
        <guid>http://lbh087.javaeye.com/blog/200480</guid>
      </item>
      <item>
        <title>hibernate 中的set</title>
        <author>lbh087</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lbh087.javaeye.com">lbh087</a>&nbsp;
          链接：<a href="http://lbh087.javaeye.com/blog/200446" style="color:red;">http://lbh087.javaeye.com/blog/200446</a>&nbsp;
          发表时间: 2008年06月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在hibernate常常用set来做onetomany或manytomany。<br />而set本身是不允许有重复的对象存在。<br /><br /><pre name="code" class="java">
AgentLinkman man = new AgentLinkman(); 
AgentLinkman man1 = new AgentLinkman();	
man.setLinkman("linkman");
man.setDeleted(false);
Date date = new Date();
man.setCreateTime(date);
man.setEmail("email");

man1.setLinkman("linkman1");
man1.setImET("ddd");
man1.setDeleted(false);
man1.setCreateTime(date);
man1.setEmail("email1");

System.out.println(men.equals(men1));
Set set = new HashSet();
set.add(man);
set.add(man1);
System.out.println(set.size());
</pre><br />上面代码运行只后输出<br />true 1<br /><br />如果我们想把什么的两个对象都设到set中必须对Linkman对象中equals进行重写.<br /><br /><pre name="code" class="java">
//对equals进行重写
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}

		if (obj != null && obj instanceof BaseEntity) {
			AgentLinkman newObj = (AgentLinkman) obj;
			return getId() == newObj.getId()&&getLinkman().equals(newObj.getLinkman());
		}
		return false;
	}

//对hashCode进行重写
   public int hashCode() {
		int result = 17;

		result = (37 * result) + ((this.id != null) ? this.id.hashCode() : 0);

		return result;
	}
</pre><br /><br />再运行上面的代码就输出:<br />false 2<br /><br />其实就对equals比较的规则进行了重写
          <br/>
          <span style="color:red;">
            <a href="http://lbh087.javaeye.com/blog/200446#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 05 Jun 2008 11:31:16 +0800</pubDate>
        <link>http://lbh087.javaeye.com/blog/200446</link>
        <guid>http://lbh087.javaeye.com/blog/200446</guid>
      </item>
      <item>
        <title>opencms同属文件</title>
        <author>lbh087</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lbh087.javaeye.com">lbh087</a>&nbsp;
          链接：<a href="http://lbh087.javaeye.com/blog/185799" style="color:red;">http://lbh087.javaeye.com/blog/185799</a>&nbsp;
          发表时间: 2008年04月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在opencms中有两种不功能的同属文件<br />1.在站点中创建同属文件，不同页面的两个编辑区域的内容保持一致，一个地方的内容改变，另一个随之改变，其他html的样式可以保持独立。（可以用在不同的页面上有相同一个可编辑内容是相同的）。<br />2.在模块中创建同属文件，他们两的模块里代码保持一致。但编辑内容是相对独立的。（可以用两个相同的样式的页面，他们的可编辑内容不一样。）
          <br/>
          <span style="color:red;">
            <a href="http://lbh087.javaeye.com/blog/185799#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 23 Apr 2008 10:55:35 +0800</pubDate>
        <link>http://lbh087.javaeye.com/blog/185799</link>
        <guid>http://lbh087.javaeye.com/blog/185799</guid>
      </item>
      <item>
        <title>xml解析</title>
        <author>lbh087</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lbh087.javaeye.com">lbh087</a>&nbsp;
          链接：<a href="http://lbh087.javaeye.com/blog/185751" style="color:red;">http://lbh087.javaeye.com/blog/185751</a>&nbsp;
          发表时间: 2008年04月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          xml解析（引用weidewei的java中四种操作DOM、SAX、JDOM、DOM4J(http://wishlife.javaeye.com/blog/181865)）xml方式详解与比较 ）<br />1.详解 <br /><br />1）DOM（JAXP Crimson解析器） <br />DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构，然后才能做任何工作。由于它是基于信息层次的，因而DOM被认为是基于树或基于对象的。DOM以及广义的基于树的处理具有几个优点。首先，由于树在内存中是持久的，因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航，而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。 <br /><br />2）SAX <br /><br />SAX处理的优点非常类似于流媒体的优点。分析能够立即开始，而不是等待所有的数据被处理。而且，由于应用程序只是在读取数据时检查数据，因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上，应用程序甚至不必解析整个文档；它可以在某个条件得到满足时停止解析。一般来说，SAX还比它的替代者DOM快许多。 <br /><br />选择DOM还是选择SAX？ 对于需要自己编写代码来处理XML文档的开发人员来说， 选择DOM还是SAX解析模型是一个非常重要的设计决策。 DOM采用建立树形结构的方式访问XML文档，而SAX采用的事件模型。 <br /><br />DOM解析器把XML文档转化为一个包含其内容的树，并可以对树进行遍历。用DOM解析模型的优点是编程容易，开发人员只需要调用建树的指令，然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用DOM解析器的时候需要处理整个XML文档，所以对性能和内存的要求比较高，尤其是遇到很大的XML文件的时候。由于它的遍历能力，DOM解析器常用于XML文档需要频繁的改变的服务中。 <br /><br />SAX解析器采用了基于事件的模型，它在解析XML文档的时候可以触发一系列的事件，当发现给定的tag的时候，它可以激活一个回调方法，告诉该方法制定的标签已经找到。SAX对内存的要求通常会比较低，因为它让开发人员自己来决定所要处理的tag.特别是当开发人员只需要处理文档中所包含的部分数据时，SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难，而且很难同时访问同一个文档中的多处不同数据。 <br /><br />3）JDOM http://www.jdom.org <br /><br />JDOM的目的是成为Java特定文档模型，它简化与XML的交互并且比使用DOM实现更快。由于是第一个Java特定模型，JDOM一直得到大力推广和促进。正在考虑通过“Java规范请求JSR-102”将它最终用作“Java标准扩展”。从2000年初就已经开始了JDOM开发。 <br /><br />JDOM与DOM主要有两方面不同。首先，JDOM仅使用具体类而不使用接口。这在某些方面简化了API，但是也限制了灵活性。第二，API大量使用了Collections类，简化了那些已经熟悉这些类的Java开发者的使用。 <br /><br />JDOM文档声明其目的是“使用20%（或更少）的精力解决80%（或更多）Java/XML问题”（根据学习曲线假定为20%）。JDOM对于大多数Java/XML应用程序来说当然是有用的，并且大多数开发者发现API比DOM容易理解得多。JDOM还包括对程序行为的相当广泛检查以防止用户做任何在XML中无意义的事。然而，它仍需要您充分理解XML以便做一些超出基本的工作（或者甚至理解某些情况下的错误）。这也许是比学习DOM或JDOM接口都更有意义的工作。 <br /><br />JDOM自身不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档（尽管它还可以将以前构造的DOM表示作为输入）。它包含一些转换器以将JDOM表示输出成SAX2事件流、DOM模型或XML文本文档。JDOM是在Apache许可证变体下发布的开放源码。 <br /><br />4）DOM4J http://dom4j.sourceforge.net <br /><br />虽然DOM4J代表了完全独立的开发结果，但最初，它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能，包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项，它通过DOM4J API和标准DOM接口具有并行访问功能。从2000下半年开始，它就一直处于开发之中。 <br /><br />为支持所有这些功能，DOM4J使用接口和抽象基本类方法。DOM4J大量使用了API中的Collections类，但是在许多情况下，它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是，虽然DOM4J付出了更复杂的API的代价，但是它提供了比JDOM大得多的灵活性。 <br /><br />在添加灵活性、XPath集成和对大文档处理的目标时，DOM4J的目标与JDOM是一样的：针对Java开发者的易用性和直观操作。它还致力于成为比JDOM更完整的解决方案，实现在本质上处理所有Java/XML问题的目标。在完成该目标时，它比JDOM更少强调防止不正确的应用程序行为。 <br /><br />DOM4J是一个非常非常优秀的Java XML API，具有性能优异、功能强大和极端易用使用的特点，同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML，特别值得一提的是连Sun的JAXM也在用DOM4J. <br /><br />2。比较 <br /><br />1）DOM4J性能最好，连Sun的JAXM也在用DOM4J.目前许多开源项目中大量采用DOM4J，例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性，那就采用DOM4J. <br /><br />2）JDOM和DOM在性能测试时表现不佳，在测试10M文档时内存溢出。在小文档情况下还值得考虑使用DOM和JDOM.虽然JDOM的开发者已经说明他们期望在正式发行版前专注性能问题，但是从性能观点来看，它确实没有值得推荐之处。另外，DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语言。它还是许多其它与XML相关的标准的基础，因为它正式获得W3C推荐（与基于非标准的Java模型相对），所以在某些类型的项目中可能也需要它（如在JavaScript中使用DOM）。 <br /><br />3）SAX表现较好，这要依赖于它特定的解析方式－事件驱动。一个SAX检测即将到来的XML流，但并没有载入到内存（当然当XML流被读入时，会有部分文档暂时隐藏在内存中）。 <br />xml代码<br /><pre name="code" class="xml">
&lt;?xml version="1.0" encoding="gbk"?>&lt;list>&lt;node>&lt;name>weidewei&lt;/name>&lt;space>http://wishlife.javaeye.com&lt;/space>&lt;/node>&lt;node>&lt;name>flying&lt;/name>&lt;space>http://user.qzone.qq.com/94611981&lt;/space>&lt;/node>&lt;/list>  
</pre><br />程序代码: <br /><pre name="code" class="java">
import java.io.File;   
import java.util.Iterator;   
import java.util.List;   
  
import javax.xml.parsers.DocumentBuilder;   
import javax.xml.parsers.DocumentBuilderFactory;   
import javax.xml.parsers.SAXParser;   
import javax.xml.parsers.SAXParserFactory;   
  
import org.dom4j.io.SAXReader;   
import org.jdom.Element;   
import org.jdom.input.SAXBuilder;   
import org.w3c.dom.Document;   
import org.w3c.dom.NodeList;   
import org.xml.sax.Attributes;   
import org.xml.sax.InputSource;   
import org.xml.sax.SAXException;   
import org.xml.sax.helpers.DefaultHandler;   
  
public class MyXMLReader extends DefaultHandler {   
  
    java.util.Stack tags = new java.util.Stack();   
    public MyXMLReader() {   
        super();   
    }   
    /**  
     * DOM方式  
    * @since V2.0  
    * @author David.Wei  
    * @date 2008-4-11  
    * @return void  
     */  
    public void DOM() {   
        long lasting = System.currentTimeMillis();   
  
        try {   
            File f = new File("F:/xmltest.xml");   
            DocumentBuilderFactory factory = DocumentBuilderFactory   
                    .newInstance();   
            DocumentBuilder builder = factory.newDocumentBuilder();   
            Document doc = builder.parse(f);   
            NodeList nl = doc.getElementsByTagName("node");   
            for (int i = 0; i &lt; nl.getLength(); i++) {   
                System.out.println("|| Name:  |"  
                        + doc.getElementsByTagName("name").item(i)   
                                .getFirstChild().getNodeValue());   
                System.out.println("||Space:  |"  
                        + doc.getElementsByTagName("space").item(i)   
                                .getFirstChild().getNodeValue());   
                System.out.println("-------------------------------------------------");            }   
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
        System.out.println("DOM RUNTIME："  
                + (System.currentTimeMillis() - lasting) + " MS");   
    }   
  
       
  
    /**  
     * SAX方式  
    * @since V2.0  
    * @author David.Wei  
    * @date 2008-4-11  
    * @return void  
     */  
    public void SAX() {   
  
        long lasting = System.currentTimeMillis();   
        try {   
            SAXParserFactory sf = SAXParserFactory.newInstance();   
            SAXParser sp = sf.newSAXParser();   
            MyXMLReader reader = new MyXMLReader();   
            sp.parse(new InputSource("F:/xmltest.xml"), reader);   
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
        System.out.println("SAX RUNTIME："  
                + (System.currentTimeMillis() - lasting) + " MS");   
    }   
  
    public void startElement(String uri, String localName, String qName,   
            Attributes attrs) {   
        tags.push(qName);   
    }   
  
    public void characters(char ch[], int start, int length)   
            throws SAXException {   
        String tag = (String) tags.peek();   
        if (tag.equals("name")) {   
            System.out.println("|| Name:  |" + new String(ch, start, length));   
        }   
        if (tag.equals("space")) {   
            System.out.println("||Space:  |" + new String(ch, start, length));   
        }   
        System.out.println("-------------------------------------------------");   
    }   
  
    /**  
     * JDOM方式  
    * @since V2.0  
    * @author David.Wei  
    * @date 2008-4-11  
    * @return void  
     */  
    public void JDOM() {   
        long lasting = System.currentTimeMillis();   
        try {   
            SAXBuilder builder = new SAXBuilder();   
            org.jdom.Document doc = builder.build(new File("F:/xmltest.xml"));   
            Element foo = doc.getRootElement();   
            List allChildren = foo.getChildren();   
            for (int i = 0; i &lt; allChildren.size(); i++) {   
                System.out.println("|| Name:  |"  
                        + ((Element) allChildren.get(i)).getChild("name")   
                                .getText());   
                System.out.println("||Space:  |"  
                        + ((Element) allChildren.get(i)).getChild("space")   
                                .getText());   
                System.out.println("-------------------------------------------------");            }   
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
        System.out.println("JDOM RUNTIME："  
                + (System.currentTimeMillis() - lasting) + " MS");   
    }   
  
    /**  
     * DOM4J方式  
    * @since V2.0  
    * @author David.Wei  
    * @date 2008-4-11  
    * @return void  
     */  
    public void DOM4J() {   
        long lasting = System.currentTimeMillis();   
        try {   
            File f = new File("F:/xmltest.xml");   
            SAXReader reader = new SAXReader();   
            org.dom4j.Document doc = reader.read(f);   
            org.dom4j.Element root = doc.getRootElement();   
            org.dom4j.Element foo;   
            for (Iterator i = root.elementIterator("node"); i.hasNext();) {   
                foo = (org.dom4j.Element) i.next();   
                System.out.println("|| Name:  |" + foo.elementText("name"));   
                System.out.println("||Space:  |" + foo.elementText("space"));   
                System.out.println("-------------------------------------------------");   
            }   
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
        System.out.println("DOM4J RUNTIME："  
                + (System.currentTimeMillis() - lasting) + " MS");   
    }   
  
    public static void main(String arge[]) {   
        MyXMLReader myXML = new MyXMLReader();   
        System.out.println("=====================DOM=========================");   
        myXML.DOM();   
        System.out.println("=====================SAX=========================");   
        myXML.SAX();   
        System.out.println("=====================JDOM========================");   
        myXML.JDOM();   
        System.out.println("=====================DOM4J=======================");   
        myXML.DOM4J();   
        System.out.println("=================================================");   
    }   
}  

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://lbh087.javaeye.com/blog/185751#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 23 Apr 2008 10:21:29 +0800</pubDate>
        <link>http://lbh087.javaeye.com/blog/185751</link>
        <guid>http://lbh087.javaeye.com/blog/185751</guid>
      </item>
  </channel>
</rss>