<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    筆頭。。
    實(shí)踐啟示
    posts - 14,comments - 3,trackbacks - 0
    問(wèn)題描述:比如從xml中讀取單個(gè)數(shù)據(jù)信息,文件數(shù)據(jù)信息為幾k左右。
    解決方案:方案一.從xml文件中讀取單個(gè)信息,每次讀取都重新打開文件
              方案二.將文件信息放到內(nèi)存中,每次通過(guò)文件信息句柄查找
              方案三.從內(nèi)存中讀取,將文件存儲(chǔ)在hashmap中,每次通過(guò)hashmap映射
    技術(shù):使用dom4j、xpath
    example1: 通過(guò)IATA查找對(duì)應(yīng)的ICAO(IATA,ICAO參考注)
        airlines.xml
        存儲(chǔ)了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文件,比較簡(jiǎn)單,不解釋了
    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,通過(guò)xpath直接查找對(duì)應(yīng)iata的icao ,第一調(diào)用該方法時(shí)讀取文件,保留doc,以后從doc中查找對(duì)應(yīng)信息
       
    /**
         * 如果沒(méi)有則返回null
         * 
    @param str 當(dāng)前的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("沒(méi)有該文件,文件url為"+fileUrl,e);
            }
            
            
    return tmp;
        }
        方法:getIcaoFromMap()與前一方法的不同在于第一次xpath信息遍歷所有信息存儲(chǔ)在hashmap中,以后通過(guò)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("沒(méi)有該文件,文件url為"+fileUrl,e);
                }
            
            
            }
            
    return airlineMap.get(iataStr);
        }
      main函數(shù)
    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);
        }
    運(yùn)行結(jié)果為:
    NAN
    getICAO:第一次672 0
    CCA
    getICAO:第二次47 0
    CCA
    getICAOMap:第一次125 0
    NAN
    getICAOMap:第二次0 0

    可見xpath中查找單個(gè)數(shù)據(jù)的時(shí)間比遍歷為map后再在內(nèi)存的hashmap中慢
    xpath是樹結(jié)構(gòu)查找,所以時(shí)間為log(n)級(jí)別,所以較慢,建議當(dāng)文件不太大時(shí)可以考慮存儲(chǔ)在本地進(jìn)行存儲(chǔ)
    注:IATA、ICAO為航空公司的二字碼、三字碼
       源碼下載:http://m.tkk7.com/Files/onedaylover/perfomance_dom4j.rar



    posted on 2008-01-14 14:11 如果有一天de 閱讀(1861) 評(píng)論(0)  編輯  收藏 所屬分類: dom4j、xml與java

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲国产精品一区| 亚洲精品天天影视综合网| 亚洲综合激情五月色一区| 最新黄色免费网站| 久久久久亚洲av无码专区导航| 8x成人永久免费视频| 久久亚洲美女精品国产精品| 永久免费视频网站在线观看| 亚洲欧洲国产精品久久| 在线观看日本免费a∨视频| 亚洲国产激情在线一区| 成年女人毛片免费播放视频m| 国产婷婷综合丁香亚洲欧洲| 成人av免费电影| 美女被免费网站视频在线| 亚洲视频在线一区二区| 免费黄网站在线看| 亚洲成人黄色在线观看| 日韩a级毛片免费视频| 一级毛片a免费播放王色电影| 亚洲人精品午夜射精日韩| 久久精品毛片免费观看| 亚洲色最新高清av网站| 免费人成无码大片在线观看| 拍拍拍无挡视频免费观看1000| 久久久婷婷五月亚洲97号色| 无码永久免费AV网站| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 三级网站免费观看| 亚洲欧洲日产v特级毛片| 在线观看免费a∨网站| 好吊色永久免费视频大全 | 99re免费在线视频| 亚洲色精品三区二区一区| 亚洲国产小视频精品久久久三级 | 91香蕉国产线在线观看免费| 亚洲色大网站WWW永久网站| 亚洲最大av无码网址| 亚洲精品在线免费观看视频| 色多多www视频在线观看免费| 亚洲av日韩综合一区在线观看|