笔头。。
实践启示
posts - 14,comments - 3,trackbacks - 0
问题描述:比如从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 阅读(1827) 评论(0)  编辑  收藏 所属分类: dom4j、xml与java

只有注册用户登录后才能发表评论。


网站导航: