??xml version="1.0" encoding="utf-8" standalone="yes"?>
package gz.lwm;
import java.io.File;
import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XPP3Reader;
public class TestDom4j {
private static final Logger log = Logger.getLogger(TestDom4j.class);
private static long bt;
public static void main(String[] args) {
Document doc = DocumentHelper.createDocument();
//先运行getXmlSAX()
bt = System.currentTimeMillis();
String strXml = getXmlSAX("xml/test.xml");
if(log.isDebugEnabled()){
log.debug("\ngetXmlSAX() use time: " + (System.currentTimeMillis() - bt) + " millis\n");
}
//再运行getXmlXPP3()
bt = System.currentTimeMillis();
String s1 =getXmlXPP3("xml/test.xml");
if(log.isDebugEnabled()){
log.debug("\ngetXmlXPP3() use time: " + (System.currentTimeMillis() - bt) + " millis\n");
}
}
public static String getXmlSAX(String xmlFile){
String result = "";
try {
SAXReader reader = new SAXReader();
Document document = reader.read(new File(xmlFile));
result = document.asXML();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static String getXmlXPP3(String xmlFile){
String result = "";
try {
XPP3Reader reader = new XPP3Reader();
Document document = reader.read(new File(xmlFile));
result = document.asXML();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
有没有这一?Document doc = DocumentHelper.createDocument()",Ҏ能的媄响很?特别是对大xml文g(管q没有用doc)
另外Q?getXmlXSAX()和getXmlXPP3()q行的先后次序对性能的媄响也很大Q?br>
试Q?br> 在我的机器上Q对一?00k左右的XML文gq行多次试后的均值结果ؓQ?br>
getXmlXPP3() use time: 265 millis
...
getXmlXSAX() use time: 359 millis
...
l论Q?br> 通过比较Q在dXML文g上,XPP3略ؓ优于SAXQ?br>
注意Q?br>
要运行例子,classpath需包含Q?br>dom4j-1.6.1.jar
jaxen-1.1-beta-10.jar
log4j-1.2.9.jar
pull-parser-2.1.10.jar
xpp3-1.1.4c.jar
参考:
dom4j : http://www.dom4j.org/
XPP : http://www.extreme.indiana.edu/xgws/xsoap/xpp/
Ruby on Rails是一个很不错的web开发框Ӟ不过׃目前其本w对国际化的支持较差Q所以需要一些辅助的东西来解军_际化问题?/font>
我最先用的是一个叫localization的插Ӟq个插g的用说明在Ruby on Rails官方的wiki上面有,q个插g使用比较单,不过功能比较弱?/font>
目前使用的是Ruby-GetTextQ这个插件功能强大,ZGNU的gettextQ详l的使用说明?/font> http://manuals.rubyonrails.com/read/chapter/105 上面有写Q我大概提一下要点:
首先要是Ruby on Rails支持UTF-8Q通过如下代码添加到environment.rb中:
$KCODE = ‘u?br />require ‘jcode?/font>
接着是安装Ruby-GetTextQ运行gem install gettext可以了Q如果是Windowsq_?Q否则?。接着是在项目根目录下面创徏po目录Q里面添加你需要Locale的名字作为子目录Q比如en, zh_CN{。需要国际化的字W串都以_(?)来书写,比如惛_际化“编辑”这个标{,可以在视图的rhtml中用_(”Edit?Q这样在昄的时候会自动ҎLocale来替换成相应的倹{?/font>
接着在项目的rakefile里面如下内容Q?/font>
desc “Create mo-files for L10n?br />task :makemo do
GetText.create_mofiles(true, “po? “locale?
end
需要注意的是在上面l出的链接的那篇文章里面Q还需要添加updatepoq样一个目标,不过q个目标在我q不起作用,L出错Q我的办法是下蝲那篇文章附带的代码: http://www.digitale-wertschoepfung.de/artikel/gettext/using-gettext-with-rails.tgz 。在里面的script目录下面有一个localize文gQ把它拷贝到你的目的script目录下面Q然后运行ruby ./script/localize {文本域的名字}可以从controllers, views中更新po数据Q用Unicode~辑器(比如UltraEditQ修改各个po文gQ然后运行rake makemo可以了。关于如果修改application.rb及其他controller的代码,查看l出的链接。此旉新启动serverQ就可以查看效果了?/font>
元编Eƈ不是一个很新的概念Q通常元编E被认ؓ是通过E序来生成程序,如果从这U意义上来考虑Q那么lex和yacc以及JavaCC应该都可以算是具有了元编E的概念Q在Java中,元编E得Cq泛的应用。但在Ruby中,元编E的使用变得相当的简单和Ҏ实现Q用Ruby语言本n来生Ruby代码Q不需要借助外部的工P著名的RoR框架是建立的Ruby元编E的基础上的。可能你你对元编E还没什么概念,但是Ruby已经内徏了元~程q种机制Q所以很有可能,你在不知不觉中就已经使用了Ruby元编E技术ؓ你带来的方便之处。如下面q段代码Q?/font>
class Person
在Ruby On Rails中,有一个OR映射层,是动态的从一张关p表映射C个对象,q主要由ActiveRecordcL实现。在OR映射模型中,关pL据库中的关系表表映射到对象模型时Q将关系表的表名映射到类名,表中的每一个元l映到对应于这个类的一个对象,元组的一个字D对应于对象的一个属性?/font>
假如我们有一个保存职员基本信息的文gQ文件的格式是这LQ第一行是文g内容的每个字D늚名称Q从W二行开始,则是每个职员的基本信息。现在我们有一个文件名为“employee.txt”的文gQ其内容如下所C:
name,age,gender
"John", 23, "male"
"Linclon", 25, "male"
假设我们p从这个文本文件中d数据Qƈq行一定的处理。如果是使用C++~程Q你首先一定会惛_应该定义一个Employeec,然后q个cM有name, age, genderq些成员变量。但是是采用q种Ҏ的话Q可以发玎ͼ如果惛_职员信息中加入一个字D,比如部门QdepartmentQ,׃得不修改Employeecȝ代码Q在EmployeecM增加一个“department”成员变量,所以我们的代码是高度依赖于文g的具体格式,q当然不是一个好的现象。我们希望有一U更单和优雅的方案,q有QRuby动态性提高给我们一个解x案,但是Q我们应该从和下手呢Q这需要Ruby的元~程能力?/font>
首先Q我们想应该有一个职员类Q在Rails中,每个关系表的名称会成为类的名Uͼ在这里,采用cM的方法,文本文件的名称作ؓcȝ名称Q在Ruby中,cd同时也是一个常量名Q所以第一个字母必Mؓ大写Q我们用如下的代码来生成类名?/font>
class_name = File.basename(file_name, ".txt").capitalize
# "employee.txt" => "Employee"
klass = Object.const_set(class_name, Class.new)
Class.new生成一个新的类Q这个类的名U是匿名的,所以采用const_set操作来绑定一个类名,变量klass是新cd的引用?/font>
生成了这个类以后Q需要想q个cL加姓名,q龄和性别q些属性,q些属性的名称是在文本文g的的W一行中l出的?br />
data = File.new(file_name)
header = data.gets.chomp
data.close
names = header.split(",")
下面的代码给Z如何生成q些属性,以及初始化这些属性倹{?br />
现在Q有了一pd的访问子Q可d可写Q,通过instance_variable_setҎQ又l每个属性做了初始化?br />
变量names是在块外部定义的Q由于块的闭合性,所以变量names在块中也是有效的。当ӞZE序的演C,又定义的了一个to_sҎQ代码如下所C:
完成了这些以后,对于cȝ构造已l基本结束了Q现在就需要真正的从文本文件中d数据了。从文本文gL据应该是一个类ҎQ而不是一个实例的ҎQ其实现代码如下Q?br />
在这个方法中Q用字的类名来匚w相关的文Ӟ比如EmployeecL到“employee。txt”?br />
然后Q从文g中读取职员信息,׃W一行是字段定义Q所以要舍弃W一行数据。从W二行开始读取数据,每读取一行数据,则构造一个Employee实例?font color="black">通过上面q个单的例子Q我们可以看出元~程的功能是相当之强大的Q用元~程技术,可以构造相当简单,优雅的解x案?/font>
1.安装Ruby
http://rubyforge.org/frs/?group_id=167
q里有windows一键安装版?/font>
2.在线安装Rails
C:\> gem install rails --include-dependencies
以上Ҏ在一般情况下都是可行? 但如果不行的? q可参照以下Ҏ:
1. 讉K:http://instantrails.rubyforge.org/wiki/wiki.pl
下蝲最新版本的InstantRails
2. 解压C指定的目录下, 注意, 目录?包括路径?不能有空?br />
3. 讉K其中的readme.txt, 里面详细说明了如何配|和q行InstantRails
以上代码卛_Ҏ需要在别h的onLoad()事g之前或之后执行自q代码!