如何通过http发送xquery到BaseX数据库

问题描述 投票:0回答:1

我正在尝试使用http接口访问BaseX数据库。

设置如下:

  • 在我的Windows 10系统上安装了最新的basex(版本10.7)
  • 创建了一个带有密码测试的用户测试
  • 导入了一个简单的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.

发送此查询的正确方式是什么?

http xquery basex
1个回答
0
投票

您上次尝试使用 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"
© www.soinside.com 2019 - 2024. All rights reserved.