1

marklogic XDMP API を使用して Twitter から XML フィードを取得しようとしています。Xquery コンソールで XML を取得できますが、その xml を変換して名前付きデータベースに入れる方法がわかりません。私は次のことをやっています:

  1. 関数を使用してこの URL " http://search.twitter.com/search.atom?q=pankaj&since_id=1212121xdmp:http-get " にアクセスすると、次の XML が取得されます。

    <?xml version="1.0" encoding="UTF-8"?>
      <twitter>
        <entry>
          <id>1212121</id>
          <content>did u hear what he talked about Pankaj</content>
        </entry>
        <entry>
         <id>1212122</id>
          <content>abc xyz abc xyz</content>
        </entry>
     </twitter>
    
  2. ここで、この xml をドキュメントごとに分割<entry>し、marklogic データベースに挿入します。

  3. また、このスクリプトは 30 秒ごとにスケジュールする必要があります。次のヒットではsince_id、URL のフィールドに最後のエントリの ID を追加する必要があります。

私は次のことを試みていますが、いくつかのエラーが発生しています。また、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)
4

2 に答える 2

3

1 つのエラーはおそらく、エスケープされていないアンパサンドに関する苦情でした。XQuery では (XML と同様に) を使用してアンパサンドをエスケープする必要があります&amp;

また、Atom 名前空間を宣言する必要もあります。これは、Twitter から返されたコンテンツがそれをデフォルトの名前空間として使用するためです。

また、各ドキュメントに一意の名前を付けたいと思うでしょう。そうしないと、MarkLogic は CONFLICTINGUPDATES エラーをスローします。以下のソリューションでは、結果のドキュメントの URI でツイート ID を使用します (要素から解析し<atom:id>ます)。

since_id 値を更新するには、いくつかのオプションがあります。残念ながら、Twitter の XML には、元のツイート ID が要素または属性の独自の値として含まれていません。フィールド)。しかし、URI でツイート ID を使用しているという事実を利用できます。URI レキシコン (管理 UI のグローバル データベース オプション) を有効にすると、cts:uris()保存した最新のツイート 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&amp;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 を使用してスケジュールされたタスクを設定します (構成 -> グループ -> デフォルト -> スケジュールされたタスク)。また、これを実行するデータベースを指定する場所でもあります。(クエリ コンソールでは、[コンテンツ ソース] ドロップダウン メニューを使用するだけです。)

代替アプローチ:

  • ツイート ID を格納する要素をロード時に挿入し、その範囲インデックスを使用して最大値を検索します。
  • に dateTime 範囲インデックスを作成し<atom:published>、それを使用して最新のツイートを検索し、値からツイート ID を抽出し<atom:id>ます。

私の解決策と、上記の 2 つの選択肢のうちの最初の方法では、ディスクの読み取りが必要ないため、その点では望ましい方法です。

于 2012-04-15T22:03:37.110 に答える
0

xdmp:http-get のリファレンス マニュアル ページを参照してください。xdmp:http-get は一連のアイテムを返します。

リファレンスマニュアルから:

xdmp:http-get の出力の最初のノードは、http サーバーからの応答ヘッダーです。

xdmp:http-get の出力の 2 番目のノードは、http サーバーからの応答です。応答は、http サーバーから送信された content-type ヘッダーに応じて、テキスト、XML、またはバイナリとして処理されます。ノードが html の場合、ヘッダーは text/html を示す必要があり、デフォルトでテキスト ドキュメントとして返されます。ドキュメントのタイプは MIME タイプのマッピングによって決定され、必要に応じて管理インターフェイスでマッピングを変更できます。ヘッダーで XML として指定されていなくても、応答が XML であることがわかっていて、応答を XML として処理したい場合は、応答を xdmp:unquote 呼び出しでラップして、応答を XML として解析できます。xml オプション ( xdmp:document-get 名前空間内) を使用して、ドキュメントを XML として扱うよう API に指示することもできます。また、応答が HTML ドキュメントであることがわかっている場合は、

最初の項目から応答タイプとステータスを確認する必要があります。text/xml 応答の場合は、次のことができます

for $i in $content[2]//entry

30 秒ごとに何かを実行するには、スケジュールされたタスクを使用できます。また、新しいドキュメントのみを保存する場合は、Twitter が各ツイートに提供する一意の Twitter URL/ID を介してそれぞれを保存できます。データベースの最後の「id」をドキュメントに保存し、それを取り出して、フェッチャーを実行するたびに更新することもできます。

于 2012-04-15T21:32:24.673 に答える