如果我在riak中存储了大量XML文档,然后想使用MapReduce查询它,我如何在map函数中使用XPath?
示例显示JSON:
var data = JSON.parse(v.values[0].data);
但我想做点什么:
var data = XML.selectNode("/root/XPath/to/my/node");
这是可能的,还是有解决方法(除了创建我的XML对象的JSON副本之外)?
答案 0 :(得分:1)
Riak的JS虚拟机本身不支持XML,但Erlang功能通过标准库的“xmerl”应用程序完成。
map_xpath(Object, _KeyData, XPath) ->
%% Get the value out of the riak object
{ok, Body} = riak_object:get_value(Object),
%% Parse the XML contents into data structures
{Doc, _} = xmerl_scan:string(unicode:characters_to_list(Body)),
%% Extract the fragment via XPath
xmerl_xpath:string(XPath, Doc).
这非常通用,你可能想要更具体的东西。由于XPath查询在某些情况下可以返回标量值而不是节点列表,因此可能希望将返回值包装在列表中,或者将某些内容与查询结果相关联并将其包装在列表中(例如,获取关闭对象的桶/键。)