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

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

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

    Flyingis

    Talking and thinking freely !
    Flying in the world of GIS !
    隨筆 - 156, 文章 - 16, 評(píng)論 - 589, 引用 - 0
    數(shù)據(jù)加載中……

    挖掘Jakarta Commons中隱藏的寶貝(三)[轉(zhuǎn)載]

    (文章轉(zhuǎn)自CSDN)

    3. 使用XPath語(yǔ)法來(lái)查詢對(duì)象和集合

    Commons JXPath是一種讓人很吃驚地(非標(biāo)準(zhǔn)的)對(duì)XML標(biāo)準(zhǔn)的使用。XPath一段時(shí)間以來(lái)一直是作為在一個(gè)XSL樣式表中選擇結(jié)點(diǎn)或結(jié)點(diǎn)集的一種方法。如果你用過(guò)XML,你會(huì)很熟悉用這樣的語(yǔ)法/foo/bar來(lái)從foo文檔元素中選擇bar子元素。

    Jakarta Commons JXPath增加了一種有趣的手法:你可以用JXPath來(lái)從bean和集合中選擇對(duì)象,其中如servlet上下文和DOM文檔對(duì)象。考慮一個(gè)包含了Person對(duì)象的列表。每一個(gè)Person對(duì)象有一個(gè)屬性的類型為Job,每一個(gè)Job對(duì)象有一個(gè)salary(薪水)屬性,類型為int。Person對(duì)象也有一個(gè)coountry屬性,它是兩個(gè)字符的國(guó)家代碼。使用JXPath,你可以很容易地選出所有國(guó)家為美國(guó),薪水超過(guò)一百萬(wàn)美元的Person對(duì)象。下面是設(shè)置一個(gè)由JXPath過(guò)濾地bean的List的代碼:

    // Person的構(gòu)造器設(shè)置姓和國(guó)家代碼
    Person person1 = new Person( "Tim", "US" );
    Person person2 = new Person( "John", "US" );
    Person person3 = new Person( "Al",  "US" );
    Person person4 = new Person( "Tony", "GB" );

    // Job的構(gòu)造器設(shè)工作名稱和薪水
    person1.setJob( new Job( "Developer", 40000 ) );
    person2.setJob( new Job( "Senator", 150000 ) );
    person3.setJob( new Job( "Comedian", 3400302 ) );
    person4.setJob( new Job( "Minister", 2000000 ) );

    Person[] personArr =
      new Person[] { person1, person2,
                     person3, person4 };

    List people = Arrays.asList( personArr );


    people List包含了四個(gè)bean: Tim, John, Al, 和George。Tim是一個(gè)掙4萬(wàn)美元的開(kāi)發(fā)者,John是一個(gè)掙15萬(wàn)美元的參議員,Al是一個(gè)掙340萬(wàn)美元的喜劇演員,Tony是一個(gè)掙200萬(wàn)歐元的部長(zhǎng)。我們的任務(wù)很簡(jiǎn)單:遍歷這個(gè)List,打印出每一個(gè)掙錢超過(guò)100百萬(wàn)美元的美國(guó)公民的名字。記住people是一個(gè)由Person對(duì)象構(gòu)成的ArrayList,讓我們先看一下沒(méi)有利用JXPath便利的解決方案:

    Iterator peopleIter = people.getIterator();
    while( peopleIter.hasNext() ) {
      Person person = (Person) peopleIter.next();

      if( person.getCountry() != null &&
          person.getCountry().equals( "US" ) &&
          person.getJob() != null &&
          person.getJob().getSalary() > 1000000 ) {
            print( person.getFirstName() + " "
                   person.getLastName() );
          }
        }
      }
    }


    上面的例子是繁重的,并有些容易犯錯(cuò)。為了發(fā)現(xiàn)合適的Person對(duì)象,你必須首先遍歷每一個(gè)Person對(duì)象并且檢查conuntry的屬性。如果country屬性不為空并且符合要求,那么你就要檢查job屬性并看一下它是否不為空并且salary屬性的值大于100萬(wàn)。上面的例子的代碼行數(shù)可以被Java 1.5的語(yǔ)法大大減少,但是,哪怕是Java 1.5,你仍舊需要在兩層上作兩次比較。

    如果你想對(duì)內(nèi)存中的一組Person對(duì)象也做一些這樣的查詢呢?如果你的應(yīng)用想顯示所有在英格蘭的名叫Tony的人呢?喔,如果你打印出每一個(gè)薪水少于2萬(wàn)的工作的名稱呢?

    如果你將這些對(duì)象存儲(chǔ)到關(guān)系數(shù)據(jù)庫(kù)中,你可以用一個(gè)SQL查詢來(lái)解決問(wèn)題,但你正在處理的是內(nèi)存中的對(duì)象,你可以不必那么奢侈。雖然XPath主要是用在XML上面,但你可以用它來(lái)寫(xiě)一個(gè)針對(duì)對(duì)象集合的“查詢”,將對(duì)象作為元素和,把bean屬性作為子元素。是的,這是一種對(duì)XPath奇怪的應(yīng)用,但請(qǐng)先看一下下面的例子如何在people上,一個(gè)由Person對(duì)象構(gòu)成的ArrayList,實(shí)現(xiàn)這三種查詢:

    import org.apache.commons.jxpath.JXPathContext;

    public List queryCollection(String xpath,
                                Collection col) {
        List results = new ArrayList();

        JXPathContext context =
            JXPathContext.newContext( col );

        Iterator matching =
            context.iterate( xpath );

        while( matching.hasNext() ) {
            results.add( matching.getNext() );
        }
        return results;
    }

    String query1 =
       ".[@country = 'US']/job[@salary > 1000000]/..";  
    String query2 =
       ".[@country = 'GB' and @name = 'Tony']";  
    String query3 =
       "./job/name";

    List richUsPeople =
        queryCollection( query1, people );
    List britishTony =
        queryCollection( query2, people );
    List jobNames =
        queryCollection( query3, people );



    queryCollection()方法使用了一個(gè)XPath表達(dá)式,將它應(yīng)用到一個(gè)集合上。XPath表達(dá)式被JXPathContext求值, JXPathContext由JXPathContext.newContext()調(diào)用創(chuàng)建,并將它傳入要執(zhí)行查詢的集合中。凋用context.iterate()來(lái)在集合中的每一個(gè)元素上應(yīng)用XPath表達(dá)式,返回包含所有符合條件的“節(jié)點(diǎn)”(這里是“對(duì)象”)的Iterator。上例中執(zhí)行的第一個(gè)查詢,query1,執(zhí)行了和不使用JXPath的例子相同的查詢。query2選擇所有國(guó)家為GB并且名字屬性為Tony的Person對(duì)象,query3返回了一個(gè)String對(duì)象的List,包含了所有Job對(duì)象的name屬性。

    當(dāng)我第一次看到Commons JXPath, 它是一個(gè)壞思想的想法觸動(dòng)了我。為什么要把XPath表達(dá)式應(yīng)用到對(duì)象上?有點(diǎn)感覺(jué)不對(duì)。把XPath作為一個(gè)bean的集合的查詢語(yǔ)言的這種意想不到的用法,在過(guò)去幾年中已經(jīng)好多次給我?guī)?lái)了便利。如果你發(fā)現(xiàn)你在list中循環(huán)來(lái)查找符合條件的元素,請(qǐng)考慮一下JXPath。更多的信息,請(qǐng)參考Jakarta Commons Cookbook的第12章,“查找和過(guò)濾”,它討論了Commons JXPath和與Commons Digester配對(duì)的Jakarta Lucene。

    還有更多
    對(duì)Jakarta Commons縱深地探索仍然在調(diào)試中。在這一系列的下面幾部分中,我會(huì)介紹一些相關(guān)的工具和功能。在Commons Collections中設(shè)置操作,在collection中使用Predicate對(duì)象,使用Commons Configuration來(lái)配置一個(gè)應(yīng)用和使用Commons Betwixt來(lái)讀寫(xiě)XML。能從Jakarta Commons得到的東西還有很多,不能在幾千字中表達(dá),所以我建議你看一下Jakarta Commons Cookbook。許多功能可能會(huì),一眼看上去,有點(diǎn)普通,但Jakarta Commons的能量就蘊(yùn)藏在這些工具的相互組合和與你的系統(tǒng)的集成當(dāng)中。

    Timothy M. O'Brien是一個(gè)專業(yè)的獨(dú)立的開(kāi)發(fā)者,在Chicago地區(qū)工作和生活。

    資源
    ·onjava.com:
    onjava.com
    ·Matrix-Java開(kāi)發(fā)者社區(qū):http://www.matrix.org.cn/
    ·APACHE:APACHE.org

    posted on 2005-11-09 12:27 Flyingis 閱讀(838) 評(píng)論(0)  編輯  收藏 所屬分類: JavaSE

    主站蜘蛛池模板: 99久在线国内在线播放免费观看| 亚洲无码在线播放| 亚洲电影免费在线观看| 免费国产草莓视频在线观看黄| 亚洲国产激情在线一区| 亚洲精品~无码抽插| 日韩精品亚洲专区在线观看| 全免费a级毛片免费看不卡| 国产一卡二卡四卡免费| 国产免费无码AV片在线观看不卡| 一本久久免费视频| 青青视频免费在线| 色欲aⅴ亚洲情无码AV| 亚洲欧美aⅴ在线资源| 亚洲综合色7777情网站777| 久久综合亚洲色HEZYO社区| 亚洲成AV人片在线观看无码| 中文字幕在亚洲第一在线 | 亚洲av日韩av天堂影片精品| 亚洲国产精品无码久久九九| 永久免费av无码网站大全| 成人免费淫片在线费观看| 亚洲欧洲免费无码| 丁香花免费完整高清观看| 精品福利一区二区三区免费视频| 100部毛片免费全部播放完整| 91香蕉在线观看免费高清| 免费无遮挡无码永久视频| 国产拍拍拍无码视频免费| 久久99青青精品免费观看| 久久国产高潮流白浆免费观看| 免费A级毛片无码视频| 色欲色香天天天综合网站免费| 午夜免费福利视频| 91免费国产在线观看| 亚洲性线免费观看视频成熟| www.黄色免费网站| 免费被黄网站在观看| 免费一看一级毛片| 久久精品国产精品亚洲艾草网美妙| 久久精品国产亚洲AV不卡|