问题描述:比如从xml中读取单个数据信息,文件数据信息为几k左右。
解决方案:方案一.从xml文件中读取单个信息,每次读取都重新打开文件
方案二.将文件信息放到内存中,每次通过文件信息句柄查找
方案三.从内存中读取,将文件存储在hashmap中,每次通过hashmap映射
技术:使用dom4j、xpath
example1: 通过IATA查找对应的ICAO(IATA,ICAO参考注)
airlines.xml
存储了airline的IATA和ICAO,root是<airlines>,root的子元素为<element>,<element>的属性为IATA,ICAO
<?xml version="1.0" encoding="UTF-8"?>
<airlines>
<element IATA="AL" ICAO="TXC"/>
<element IATA="AY" ICAO="FIN"/>
.
.
</airlines>
AirlinesXml.java
方法parse、getDocment解析xml文件,比较简单,不解释了
private static Document getDocument() throws DocumentException
{
if(doc==null){
doc = parse(new File(fileUrl));
}
return doc;
}
private static Document parse(File file) throws DocumentException {
SAXReader saxReader = new SAXReader();
Document doc = saxReader.read(file);
return doc;
}
方法getICAO(),striata,通过xpath直接查找对应iata的icao ,第一调用该方法时读取文件,保留doc,以后从doc中查找对应信息
/**
* 如果没有则返回null
* @param str 当前的strIATA
* @return String icao
*/
public static String getICAO(String strIATA)
{
String tmp=null;
String xpathStr="//element[@IATA='"+str+"']";
try {
Document doc=getDocument();
Node node=(Node) doc.selectSingleNode(xpathStr);
if(node!=null)
{
tmp=node.valueOf("@ICAO");
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
logger.error("没有该文件,文件url为"+fileUrl,e);
}
return tmp;
}
方法:getIcaoFromMap()与前一方法的不同在于第一次xpath信息遍历所有信息存储在hashmap中,以后通过hashmap查找
public static String getICAOFromMap(String iataStr)
{
if(airlineMap==null){
String xpath="//element[@IATA]";
airlineMap=new HashMap<String, String>();
try{
Document doc=getDocument();
List list=doc.selectNodes(xpath);
for(Iterator iter=list.iterator();iter.hasNext();)
{
Node node=(Node)iter.next();
airlineMap.put(node.valueOf("@IATA"), node.valueOf("@ICAO"));
}
}catch (DocumentException e) {
// TODO Auto-generated catch block
logger.error("没有该文件,文件url为"+fileUrl,e);
}
}
return airlineMap.get(iataStr);
}
main函数
public static void main(String[] args){
long time1=System.currentTimeMillis();
System.out.println(getICAO("OV"));
long time2=System.currentTimeMillis();
System.out.println("getICAO:第一次"+(time2-time1)+" "+(time2-time1)/1000);
System.out.println(getICAO("CA"));
long time3=System.currentTimeMillis();
System.out.println("getICAO:第二次"+(time3-time2)+" "+(time3-time2)/1000);
System.out.println(getICAOFromMap("CA"));
long time4=System.currentTimeMillis();
System.out.println("getICAOMap:第一次"+(time4-time3)+" "+(time4-time3)/1000);
System.out.println(getICAOFromMap("OV"));
long time5=System.currentTimeMillis();
System.out.println("getICAOMap:第二次"+(time5-time4)+" "+(time5-time4)/1000);
}
运行结果为:
NAN
getICAO:第一次672 0
CCA
getICAO:第二次47 0
CCA
getICAOMap:第一次125 0
NAN
getICAOMap:第二次0 0
可见xpath中查找单个数据的时间比遍历为map后再在内存的hashmap中慢
xpath是树结构查找,所以时间为log(n)级别,所以较慢,建议当文件不太大时可以考虑存储在本地进行存储
注:IATA、ICAO为航空公司的二字码、三字码
源码下载:
http://www.blogjava.net/Files/onedaylover/perfomance_dom4j.rar
posted on 2008-01-14 14:11
如果有一天de 阅读(1845)
评论(0) 编辑 收藏 所属分类:
dom4j、xml与java