跳轉到內容

XQuery/儲存和更新資料

來自華夏公益教科書,開放的書籍,開放的世界

您有一些需要將資料儲存到資料庫的 Web 表單(例如 XForms)。您希望使用單個 XQuery 來儲存新資料並更新現有資料。如果表單用於更新現有記錄,您可以假設它在要儲存的 XML 文件中有一個 <id> 標記。新文件需要為它們建立新的文件 ID。

我們使用 HTTP POST 資料並掃描特定元素,例如 id。如果記錄沒有 id 元素,我們知道我們必須建立新記錄。請注意,此示例中尚未生成序列號。如果存在id引數,我們將刪除舊檔案並將新資料儲存到同一檔案中。請注意,沒有備份或存檔。

儲存/刪除單個 XML 檔案的示例程式

[編輯 | 編輯原始碼]
xquery version "1.0";
declare namespace exist = "http://exist.sourceforge.net/NS/exist"; 
declare namespace request="http://exist-db.org/xquery/request";
declare namespace xmldb="http://exist-db.org/xquery/xmldb";

declare option exist:serialize "method=xhtml media-type=text/xml indent=yes";

(: Call this like this:
For new records:
https://:8080/exist/rest/db/xquery-examples/save-test/new-update-save.xq?new=true

For updates where each record has an id:
https://:8080/exist/rest/db/xquery-examples/save-test/new-update-save.xq?id=123
:)

(: replace this with your document, for example use request:get-data() :)
let $my-doc := 
<data>
   <id>123</id>
   <message>Hello World</message>
</data>

let $id := $my-doc/id

let $collection := 'xmldb:exist:///db/xquery-examples/save-test'

(: this logs you in; you can also get these variables from your session variables :)
let $login := xmldb:login($collection, 'mylogin', 'my-password')

(: replace this with a unique file name with a sequence number :)
let $file-name := 'test-save.xml'

return
<results>{
if (not($id))
       then (
       let $store-return-status := xmldb:store($collection, $file-name, $my-doc)
             return
                <message>New Document Created {$store-return-status} at {$collection}/{$file-name}</message>
       )
       else (
           let $remove-return-status := xmldb:remove($collection, $file-name)
           let $store-return-status := xmldb:store($collection, $file-name, $my-doc)
           return
                <message>Document {$id} has been successfully updated</message>)
    }</results>

在 XML 檔案末尾插入 XML 專案的示例程式

[編輯 | 編輯原始碼]

有時您不想建立新的 XML 檔案,而只是將結果儲存到現有 XML 檔案的末尾。這可以使用 XQuery 更新操作來完成。

W3C 關於 XQuery 更新操作的候選推薦

eXist 1.2/1.3/1.4/1.5 中 XQuery 更新操作的語法

例如,在 eXist 1.2/1.3/1.4 中,操作語法如下

     let $append-result := update insert <item/> into doc("myfile.xml")/items
華夏公益教科書