跳转到内容

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://127.0.0.1:8080/exist/rest/db/xquery-examples/save-test/new-update-save.xq?new=true

For updates where each record has an id:
https://127.0.0.1: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
华夏公益教科书