提问人:MartinK 提问时间:10/27/2023 更新时间:10/29/2023 访问量:34
如何通过 http 将 xquery 发送到 BaseX 数据库
How to send a xquery to a BaseX database via http
问:
我正在尝试使用 http 接口访问 BaseX 数据库。
设置如下:
- 在我的 Windows 10 系统(版本 10.7)上安装了最新的 basex
- 使用密码测试创建了用户测试
- 导入了一个简单的 XML:
` <?xml version="1.0" encoding="UTF-8"?>
<musicCollection>
<entry>
<Type>CD</Type>
<Name>Greatest Hits</Name>
<Artist>The Music Band</Artist>
<Year>1998</Year>
<Songs>
<Song>
<Name>Song 1</Name>
<Author>John Songwriter</Author>
<Length>4:30</Length>
</Song>
<Song>
<Name>Song 2</Name>
<Author>Lisa Lyricist</Author>
<Length>3:45</Length>
</Song>
<Song>
<Name>Song 3</Name>
<Author>Lisa Lyricist</Author>
<Length>1:45</Length>
</Song>
</Songs>
</entry>
.... more entries
</musicCollection>
`
- 使用 CLI 界面检查了设置:
java -cp BaseX.jar org.basex.BaseXClient ...以测试/测试身份登录...
在提示符下:
xquery for $e in doc('music')/musicCollection/entry where $e/Type = "LP" return <entry> {$e/Type} {$e/Name} {$e/Artist} </entry>
结果:
<entry><Type>LP</Type><Name>Rock Revolution</Name><Artist>The Rockers</Artist></entry>
<entry><Type>LP</Type><Name>Rock Revolution</Name><Artist>The Other Ones</Artist></entry>
Query "BaseX" executed in 6.44 ms.
- 然后我在端口 123 上使用包含的脚本启动了 http 子系统:
"D:\Programs\BaseX\bin\basexhttp.bat" -h123
- 在另一个命令 shell 中,我使用 curl 访问数据库:
curl -u test:test -X POST -d "for $e in doc('music')/musicCollection/entry return <entry> {$e/Type} {$e/Name} {$e/Artist} </entry>" "http://localhost:123/rest"
还有这个:
curl -u test:test -X POST -d "for $e in /musicCollection/entry return <entry> {$e/Type} {$e/Name} {$e/Artist} </entry>" "http://localhost:123/rest/music"
` 我收到了这个错误回复:
"" (Line 1): Content ist nicht zulässig in Prolog. (Line 1: content is illegal in prolog)
试试这个:
curl -u test:test -X POST -d "<query>for $e in /musicCollection/entry return <entry> {$e/Type} {$e/Name} {$e/Artist} </entry></query>" "http://localhost:123/rest/music"
我得到了:
Stopped at D:/Programs/BaseX/webapp, 1/1:
[XPST0003] Empty query.
有了这个:
curl -u test:test -X POST -d "<query><text>for $e in /musicCollection/entry return <entry> {$e/Type} {$e/Name} {$e/Artist} </entry></text></query>" "http://localhost:123/rest/music"
我收到此错误:
Stopped at D:/Programs/BaseX/webapp, 1/41:
[XPST0003] Expecting return value.
发送此查询的正确方式是什么?
答:
2赞
Christian Grün
10/29/2023
#1
您上次尝试使用 POST 方法发送查询非常接近: 如果 XQuery 字符串包含尖括号或 XML 实体,则需要使用 CDATA 来防止查询字符被解释为 XML:
curl
-u test:test
-X POST
-d "<query><text><![CDATA[for $e in /musicCollection/entry return <entry> {$e/Type} {$e/Name} {$e/Artist} </entry>]]></text></query>"
"http://localhost:123/rest/music"
如果查询字符串明确无误,则不需要 CDATA 部分:
curl
-u test:test
-X POST
-d "<query><text>/musicCollection/entry/(element entry {Type,Name,Artist})</text></query>"
"http://localhost:123/rest/music"
评论