3

我正在尝试在 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]

和“标题”有

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

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

4

2 回答 2

4

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

title = pizza.pick("$..Title.$t");

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


关于与您要考虑的问题无关的事情的旁注:

1) 感谢您分享整个规则集,您遇到了什么问题以及您的预期。使回答您的问题变得更加容易。

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

ruleset avogadro {

应该看起来更像

规则集 a60x304 {

3)你不需要

setting ()

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

于 2010-12-26T05:26:19.503 回答
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>"

希望我现在有一些披萨!

于 2010-12-26T05:25:45.433 回答