2011-04-25 67 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'];