KRL和雅虎本地搜索

时间:2010-12-26 04:51:24

标签: krl

我正在尝试在Kynetx应用程序中使用Yahoo Local Search。

ruleset avogadro {
  meta {
    name "yahoo-local-ruleset"
    description "use results from Yahoo local search"
    author "randall bohn"
    key yahoo_local "get-your-own-key"
  }
  dispatch { domain "example.com"}
  global {
    datasource local:XML <- "http://local.yahooapis.com/LocalSearchService/V3/localsearch";
  }

  rule add_list {
    select when pageview ".*" setting ()
    pre {
      ds = datasource:local("?appid=#{keys:yahoo_local()}&query=pizza&zip=#{zip}&results=5");
      rs = ds.pick("$..Result");
    }
    append("body","<ul id='my_list'></ul>");
    always {
      set ent:pizza rs;
    }
  }

  rule add_results {
    select when pageview ".*" setting ()
    foreach ent:pizza setting pizza
    pre {
      title = pizza.pick("$..Title");
    }
    append("#my_list", "<li>#{title}</li>");
  }
}

我最终得到的清单是

. [object Object]

和'title'有

{'$t' => 'Pizza Shop 1'}

我无法弄清楚如何获得标题。看起来原始XML文件中的“文本内容”变成{'$ t'=&gt; 'text content'}和'$ t'给pick()带来了问题。

2 个答案:

答案 0 :(得分:4)

当XML数据源和数据集转换为JSON时,XML节点中的文本值将分配给$ t。您可以通过将前块中的pick语句更改为

来选择标题文本
title = pizza.pick("$..Title.$t");

试一试,看看是否能解决您的问题。


关于与您的问题无关的事项的附注:

1)感谢您分享整个规则集,您遇到了什么问题以及您的期望。让你更容易回答你的问题。

2)不应该从AppBuilder或命令行gem为您生成的规则集标识符进行更改。您当前的标识符

ruleset avogadro {

应该看起来更像

规则集a60x304 {

3)你不需要

setting ()

在select语句中,除非正则表达式中有一个捕获组

答案 1 :(得分:3)

事实证明,pick(“$ .. Title。$ t”)确实有效。看起来很有趣,但它确实有效。我觉得不像小丑帽那么有趣。

name = pizza.pick("$..Title.$t");
city = pizza.pick("$..City.$t");
phone = pizza.pick("$..Phone.$t");
list_item = "<li>#{name}/#{city} #{phone}</li>"

希望我现在有一些披萨!