我正在尝试使用marklogic从twitter获取XML提要,我能够在Xquery控制台中获取XML,但无法找到如何转换该xml并将其放入命名数据库。我所做的工作如下:
当使用
<entry>文档并插入到marklogic数据库中。since_id字段中附加最后一个条目的id。H 210G 211我正在尝试跟踪,但得到了一些错误,我也不知道在哪里给DB的名称和如何附加since_id。
let $content := xdmp:http-get("http://search.twitter.com/search.atom?q=pankaj&since_id=191622916163641344",
<options xmlns="xdmp:document-get">
<encoding>UTF-8</encoding>
</options>)
return
for $i in $content//entry
return
xdmp:document-insert(
"/example.xml", $content//entry,
xdmp:default-permissions(),
xdmp:default-collections(),
10)发布于 2012-04-15 22:03:37
一个错误可能是关于非转义符号的抱怨,在XQuery (像XML一样)中,需要使用&来转义。
您还需要声明Atom命名空间,因为Twitter返回的内容使用该名称空间作为默认名称空间。
您还需要为每个文档指定一个唯一的名称;否则,MarkLogic将抛出CONFLICTINGUPDATES错误。在下面的解决方案中,我在结果文档的URI中使用了tweet ID (从<atom:id>元素解析它)。
要更新since_id值,您有几个选项。不幸的是,来自Twitter的XML没有将原始的tweet ID作为元素或属性的自身值,这意味着如果不首先修改插入时的文档(包括这样的字段),我们就无法在其上创建范围索引。但是,我们可以利用这样一个事实,即我们在URI中使用了tweet ID。启用URI词典(管理UI中的全局数据库选项)将允许您调用cts:uris()以轻松获取存储的最新tweet ID。
下面是我提出的使用此技术的完整解决方案:
declare namespace atom="http://www.w3.org/2005/Atom";
declare variable $initial-tweet-id := "191622916163641344";
declare variable $uri-prefix := "/tweets/";
declare variable $uri-suffix := ".xml";
declare variable $latest-tweet-uri := cts:uri-match(concat($uri-prefix,"*"))[last()];
declare variable $latest-tweet-id := if ($latest-tweet-uri)
then substring-after(
substring-before($latest-tweet-uri,$uri-suffix),
$uri-prefix)
else $initial-tweet-id;
let $content := xdmp:http-get(
concat("http://search.twitter.com/search.atom?q=pankaj&since_id=",
$latest-tweet-id),
<options xmlns="xdmp:document-get">
<encoding>UTF-8</encoding>
</options>)
for $entry in $content//atom:entry
let $tweet-id := tokenize($entry/atom:id, ":")[last()]
return
( xdmp:log(concat("Adding tweet:", $tweet-id)),
xdmp:document-insert(
concat($uri-prefix, $tweet-id, $uri-suffix),
$entry,
xdmp:default-permissions(),
xdmp:default-collections(),
10)
)要每30秒运行一次,您可以使用管理UI设置一个预定任务(配置->组->默认->调度任务)。这也是您指定要在哪个数据库上运行此操作的地方。(在查询控制台中,您只需使用"Content“下拉菜单。)
备选办法:
<atom:published>上创建dateTime范围索引,使用该索引查找最新的tweet,并从<atom:id>值中提取tweet ID。我的解决方案和上述两种方案中的第一种不需要任何磁盘读取,因此在这方面它们更可取。
发布于 2012-04-15 21:32:24
有关xdmp:http-get的参考手册页面。xdmp:http-get返回一系列项。
参考手册中:
是xdmp: http -get输出中的第一个节点,它是来自http服务器的响应头。
xdmp输出中的第二个节点是来自http服务器的响应。响应被视为文本、XML或二进制文件,这取决于从http服务器发送的内容类型标头。如果节点是html,则头应该指示text/html,默认情况下它作为文本文档返回。文档的类型由mimetype映射决定,您可以根据需要更改Admin接口中的映射。如果您碰巧知道响应是XML,即使报头没有将其指定为XML,并且希望将响应处理为XML,则可以将响应包装在xdmp:unquote调用中,以将响应解析为XML。您还可以使用XML选项(在xdmp: document -get命名空间中)告诉API将文档视为xml。另外,如果您知道响应是一个HTML文档,您可以将响应包装在一个xdmp:tidy调用中,它将文本作为HTML来处理,清理它,并返回一个XHTML文档。
您应该检查第一项的响应类型和状态。如果是一个文本/xml响应,那么您可以这样做
for $i in $content[2]//entry要获得每30秒运行一次的内容,可以使用预定的任务。如果您只想存储新的文档,您可以通过twitter为每条twitter提供的唯一twitter URL/ID来存储每个文档。您还可以将最后一个'id‘存储在文档中的数据库中,然后在每次运行获取器时取出它并更新它。
https://stackoverflow.com/questions/10165985
复制相似问题