使用erlang返回特定的xml标记

时间:2013-10-20 13:04:34

标签: xml-parsing erlang

get_currency() ->       
URL = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.xchange%20where%20pair%20in%20(%22GBPEUR%22)&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys",
{Result, Info} = httpc:request(URL),
case Result of
    error -> 
        {Result, Info};
    ok ->
        {{_Protocol, Code, _CodeStr}, _Attrs, WebData} = Info,
        WebData
    end.

extract_text(Content) ->
Item = hd(Content),
case element(1, Item) of
    xmlText -> Item#xmlText.value;
    _ -> ""
end.



analyze_info(WebData) ->        
ToFind = [rate],
Parsed = element(1, xmerl_scan:string(WebData)),
Children = Parsed#xmlElement.content,
ElementList = [{El#xmlElement.name, extract_text(El#xmlElement.content)} || El <- Children, element(1, El) == xmlElement],
lists:map(fun(Item) -> lists:keyfind(Item, 1, ElementList) end, ToFind).

以上是用于尝试从网址http://query.yahooapis.com/v1/public/yql?q=select%20 *%20从%20yahoo.finance.xchange%20 where%20pair%20in%20(%22GBPEUR%22)中提取标记内容的代码&安培; ENV =商店%3A%2F%2Fdatatables.org%2Falltableswithkeys

这是我在shell中所做的。

inets:start().
XML = scrapetest:get_currency().
scrapetest:analyze_info(XML).

我得到的回报简直就是&#34;假&#34;。我不确定我做错了什么。

1 个答案:

答案 0 :(得分:0)

只需在代码中添加一些日志即可。

EG。添加io:format("~p~n", [ElementList]), - 会向您显示ElementList仅包含result标记,您应该在列表推导中更深入一级,以获取名为rate的标记

这是常见的建议。

在你的情况下,似乎更好的决定是递归查找功能(如果你想写一些代码)

或使用一些电池,如xmerl_xpath

只是另一个analyze_info的示例:

analyze_info(WebData) -> 
  Parsed = element(1, xmerl_scan:string(WebData)),
  xmerl_xpath:string("//Rate/text()", Parsed).

这将返回:

[{xmlText,[{'Rate',2},{rate,1},{results,1},{query,1}],
      1,[],"1.1813",text}]