2011-04-25 138 views
3

我從一個XML數據源,看起來像這樣回來的哈希:採摘哈希陣列從一個哈希

{..., 
    'records' :{ 
    'record' :[ 
     {'availability' :{'$t' :'available'}, ...}, 
     {'availability' :{'$t' :'available'}, ...} 
    ] 
    } 
}; 

我想獲得的所有record哈希到一個數組這樣我就可以filter()它並做一些其他的操作。然而,當我在我的pre塊這一說法,

raw_records = raw.pick("$..record"); 

被返回數組是兩個空字符串數組:

var raw_records = ['', '']; 

奇怪的是,我可以挑選出只是availability與預期的結果:

availability = raw.pick("$..availability.$t"); 

生產

var availability = ['available', 'available']; 

我的第一個pick()有什麼問題?

編輯:這是一個更完整的版本,應該有助於重現問題。這有點不同,因爲我現在使用JSON版本的Web服務:

global { 
    datasource hbll <- "https://svc.lib.byu.edu/services/catalog/v1/search/?field=isbn&format=json&terms="; 
} 

rule new_rule { 
    select when pageview "amazon.com/.*/?dp/(.*)/" setting (isbn) 
    pre { 
     //This is the array with two empty strings... 
     raw = datasource:hbll(isbn); 
     myfilter = function(x) { x.pick("availability") eq "available"; }; 
     records = raw.filter(myfilter); 
     len = records.length(); 
     availability = records.pick("$..availability"); 
     middleman = len > 1 => availability[0] | availability; 
     available = middleman eq "available" => true | false; 
     url_list = records.pick("$..url"); 
     url = len > 1 => url_list[0] | url_list; 
     msg = << 
      <p>This book is available for checkout at the BYU Library.</p> 
      <a href="#{url}">More information</a> 
     >>; 
    } 
    notify("BYU Harold B. Lee Library", msg) with sticky=true; 
} 
+0

無法重現。需要更多信息。 :) – Alex 2011-04-25 23:31:49

+0

現在正在努力複製和挖掘。感謝您的擴展示例。 – Alex 2011-04-26 02:42:12

+0

對於上面的示例,當我遇到此問題時,我一直在測試http://www.amazon.com/Sams-Teach-Yourself-Java-Hours/dp/0672330768/。 – 2011-04-26 02:50:40

回答

1

我將需要一個更完整的示例。測試程序和結果我都低於:

ruleset a8x167 { 
    meta { 
     name "Pick - Array of Hashes" 
     description << 
      Testing 
     >> 
     author "Sam Curren" 
     logging on 
    } 

    dispatch {} 

    global { 
     raw = { 
      'records' :{ 
      'record' :[ 
       {'availability' :{'$t' :'available'}}, 
       {'availability' :{'$t' :'available'}} 
      ] 
      } 
     }; 

    } 

    rule test { 
     select when pageview ".*" setting() 
     pre { 
      raw_records = raw.pick("$..record"); 
      availability = raw.pick("$..availability.$t"); 
     } 
     notify("Hello World", "This is a sample rule."); 
    } 
} 

和結果:

var raw_records = [{'availability' :{'$t' :'available'}}, {'availability' :{'$t' :'available'}}]; 
var availability = ['available', 'available'];