BaseX簡介
1. 引言
在本教學中,我們將了解BaseX XML 資料庫。我們將了解它是什麼、如何使用它以及我們可以用它做什麼。
2. 什麼是BaseX?
BaseX 是一個輕量級、高效能且可擴展的 XML 資料庫。它允許我們儲存大量以 XML 格式提供的數據,然後允許我們使用XQuery和XPath對其進行查詢和操作。
BaseX 為我們提供了多種處理資料的方式,包括 GUI 應用程式、命令列介面和 HTTP API,使我們能夠提供複雜的 XQuery 處理。
3. 運行 BaseX
現在我們知道了 BaseX 的用途,我們需要能夠運行它。 BaseX 需要 Java 17 或更新版本的 JVM。
我們可以從BaseX 下載頁面下載 ZIP 套件。它提供了運行 BaseX 所需的一切。解壓縮後,我們就可以開始了。
在這個軟體包中,我們擁有完整的資料庫。其中包括:
- 在
/bin中,有一些用於以各種方式啟動資料庫的腳本。 - 在
/data中,我們的資料庫中存在的實際資料。 - 在
/lib和/webapp中,實際的資料庫軟體。 - 在
/src和/repo中,XQuery 腳本和模組的來源。
我們的 BaseX 安裝實際上可以管理許多獨立的資料庫。每個資料庫都作為/data目錄中的單獨目錄存在。
4. 命令列介面
BaseX 帶有命令列介面,允許我們直接操作資料庫。這對於管理操作和快速查詢資料非常有用。然而,它並非為並發存取資料庫而設計的。我們需要依賴伺服器 HTTP API 來實現這一點,稍後我們將會看到。
4.1. 啟動命令列介面
我們可以透過在解壓縮後的 BaseX 安裝中執行./bin/basex或./bin/basex.bat命令來啟動命令列介面:
$ ./bin/basex
BaseX 12.0 [Standalone]
Try 'help' to get more information.
>
一旦我們完成此操作,我們就有一個介面可以直接存取我們安裝中的資料庫。
4.2. 建立和刪除資料庫
我們可以使用CREATE DATABASE指令來建立一個新的資料庫:
> CREATE DATABASE baeldung
Database 'baeldung' created in 18.82 ms.
預設情況下,這將建立一個空資料庫。但是,我們也可以提供一個資料檔案來儲存在資料庫中:
> CREATE DATABASE baeldung https://files.basex.org/xml/factbook.xml
Database 'baeldung' created in 734.75 ms.
該文件可以在本機上訪問,也可以透過 HTTP URL 存取。 BaseX 資料庫會根據需要下載該檔案並將其儲存在新資料庫中。
我們現在可以使用LIST命令查看我們新建立的資料庫:
> LIST
Name Resources Size Input Path
----------------------------------------------------------------------
baeldung 1 2304048 https://files.basex.org/xml/factbook.xml
1 database(s).
如果我們不再需要資料庫,我們可以使用DROP DATABASE命令將其刪除:
> DROP DATABASE baeldung
Database 'baeldung' was dropped.
一旦完成,資料庫就會立即被刪除。
4.3. 開啟資料庫
我們經常需要存取一個已經存在的資料庫,而不是建立一個新的資料庫。這可以透過使用OPEN命令並指定資料庫名稱來完成:
> OPEN baeldung
Database 'baeldung' was opened in 26.67 ms.
完成後,我們所有的命令現在都在這個資料庫的上下文中執行。
當創建資料庫時,它也會自動為我們打開,所以在這種情況下我們不需要這樣做。
我們也可以使用INFO DATABASE命令來查看目前開啟的資料庫:
> INFO DATABASE
Database Properties
NAME: baeldung
SIZE: 2251 kB
NODES: 104627
DOCUMENTS: 1
BINARIES: 0
VALUES: 0
TIMESTAMP: 2025-10-22T06:40:31.403Z
UPTODATE: true
如果我們在資料庫之間切換並且需要檢查我們在任何給定時間的位置,這將很有用。
4.4. 管理資源
現在我們有了一個資料庫,我們需要在其中添加一些資料。資料庫中的所有資料都以 XML 檔案的形式存在,並且不要求這些不同的 XML 檔案具有相同的架構。我們可以將任何資料儲存在其中,然後就可以處理。
我們可以使用ADD命令將新檔案加入資料庫:
> ADD https://files.basex.org/xml/xmark.xml
Resource(s) added in 510.38 ms.
當我們這樣做時,我們可以按照建立新資料庫的方式指定檔案名稱。
我們資料庫中的所有檔案都有一個名稱。預設情況下,這是我們剛剛新增的檔案的檔案名稱—在本例中為xmark.xml 。如果需要,我們可以在新增檔案時使用ADD TO指定要使用的名稱:
> ADD TO other.xml https://files.basex.org/xml/xmark.xml
Resource(s) added in 219.85 ms.
然後我們可以使用 DIR 命令查看資料庫中存在哪些檔案:
> DIR
Input Path Type Content-Type Size
-------------------------------------------
factbook.xml xml application/xml 104627
other.xml xml application/xml 5256
xmark.xml xml application/xml 5256
3 entries.
如果需要,我們也可以使用DELETE命令從資料庫中刪除檔案:
> DELETE other.xml
1 resource(s) deleted in 3.88 ms.
為此,我們需要知道該文件在資料庫中的名稱。一旦完成此操作,資料將永久刪除,無法再使用。
4.5. 查詢資源
一旦我們的資料庫中有了數據,我們就需要能夠查詢這些數據。我們可以使用XQUERY指令來實作。它需要一個用於檢索資料的 XQuery 查詢:
> XQUERY //item/name
<name>duteous nine eighteen </name>
...
<name>holds perhaps despair amorous </name>
Query "basex" executed in 21.15 ms.
針對我們資料庫中的每個檔案執行此查詢,並傳回所有符合項目。
傳回的匹配結果可以根據需要簡單或複雜。在上面的例子中,傳回的是一個元素,但如果需要,我們也可以傳回整個元素樹:
> xquery //city
<city id="f0_1461" country="f0_136" longitude="10.7" latitude="46.2">
<name>Tirane</name>
<population year="87">192000</population>
</city>
...
<city id="f0_36514" country="f0_136" longitude="20.1" latitude="41.1">
<name>Elbasan</name>
<population year="87">53000</population>
</city>
Query "basex" executed in 10.79 ms.
預設情況下,此查詢將對目前資料庫中的每個檔案進行操作。如果需要,我們可以使用db:get()函數指定要存取的其他資料庫:
> XQUERY db:get("baeldung")//item/name
<name>duteous nine eighteen </name>
...
<name>holds perhaps despair amorous </name>
Query "basex" executed in 10.0 ms.
或者,我們可以使用doc()函數來定位資料庫中的單一檔案:
> XQUERY doc("baeldung/xmark.xml")//item/name
<name>duteous nine eighteen </name>
...
<name>holds perhaps despair amorous </name>
Query "basex" executed in 5.4 ms.
這樣做,我們就可以盡可能地探索數據。
5.HTTP介面
除了用於管理資料庫的命令列介面之外,BaseX 還附帶一個 HTTP 伺服器,可以以多種方式公開我們的資料。
5.1. 啟動 HTTP 伺服器
我們可以透過在解壓縮後的 BaseX 安裝中執行./bin/basexhttp或./bin/basexhttp.bat指令來啟動 HTTP 伺服器:
-> % ./bin/basexhttp
BaseX 12.0 [HTTP Server]
[main] INFO org.eclipse.jetty.server.Server - jetty-12.0.22; built: 2025-06-02T15:25:31.946Z; git: 335c9ab44a5591f0ea941bf350e139b8c4f5537c; jvm 21.0.2+13-LTS
[main] INFO org.eclipse.jetty.ee9.webapp.StandardDescriptorProcessor - NO JSP Support for /, did not find org.eclipse.jetty.ee9.jsp.JettyJspServlet
[main] INFO org.eclipse.jetty.session.DefaultSessionIdManager - Session workerName=node0
Server was started (port: 1984).
[main] INFO org.eclipse.jetty.server.handler.ContextHandler - Started oeje9n.ContextHandler$CoreContextHandler@2c78d320{BaseX: The XML Database and XQuery Processor,/,b=file:///Users/coxg/source/me/baeldung/basex/webapp/,a=AVAILABLE,h=oeje9n.ContextHandler$CoreContextHandler$CoreToNestedHandler@132e0cc{STARTED}}
[main] INFO org.eclipse.jetty.server.AbstractConnector - Started ServerConnector@512baff6{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}
[main] INFO org.eclipse.jetty.server.Server - Started oejs.Server@77fbd92c{STARTING}[12.0.22,sto=0] @613ms
HTTP Server was started (port: 8080).
HTTP STOP Server was started (port: 8081).
這實際上啟動了三個網路伺服器,預設監聽連接埠 1984、8080 和 8081。連接埠 8080 上的伺服器很有趣,因為這是我們可以向其發送查詢的 HTTP 伺服器。
5.2. 身份驗證
該伺服器需要身份驗證以確保我們的資料安全。預設情況下,有一個admin帳戶,其密碼在 HTTP 伺服器首次啟動時產生。我們可以在位於/data/.logs:
$ cat data/.logs/2025-10-20.log
07:50:10.457
SERVER
admin
OK
Server was started (port: 1984).
07:50:10.505
SERVER
admin
INFO
Initial admin password (change after first login): 29a058d7-9dc3-4d7a-bab1-8380eca78e42
如果我們願意,我們可以使用命令列客戶端的PASSWORD命令來更改它:
> PASSWORD NewPassword
Password of user 'admin' changed.
我們向伺服器發出的所有 HTTP 請求都需要使用 HTTP 基本驗證提供憑證。這些憑證包括使用者名稱「admin」和密碼,並按照基本驗證的預期方式進行正確編碼。我們的 HTTP 用戶端應該能夠自動處理這些憑證。
5.3. 存取資料庫
我們可以透過對伺服器上的/rest端點進行 HTTP 呼叫來列出可用的資料庫:
GET /rest HTTP/1.1
Authorization: Basic YWRtaW46TmV3UGFzc3dvcmQ=
回應將是一個 XML 文檔,描述我們建立的所有資料庫:
HTTP/1.1 200 OK
Content-Type: application/xml; charset=UTF-8
<databases xmlns="http://basex.org/rest">
<database resources="3" size="2796460">baeldung</database>
</databases>
5.4. 訪問資源
我們可以透過在 URL 中包含特定資料庫來存取它,例如/rest/baeldung 。如果我們直接呼叫它,我們將看到已新增到資料庫中的所有文件的清單:
GET /rest/baeldung HTTP/1.1
Authorization: Basic YWRtaW46TmV3UGFzc3dvcmQ=
---
HTTP/1.1 200 OK
Content-Type: application/xml; charset=UTF-8
<database xmlns="http://basex.org/rest" name="baeldung"> <resource type="xml" content-type="application/xml" size="104627">factbook.xml</resource> <resource type="xml" content-type="application/xml" size="5256">other.xml</resource> <resource type="xml" content-type="application/xml" size="5256">xmark.xml</resource> </database>
然後,我們可以透過在 URL 中包含這些資源來直接存取它們 - 例如, /rest/baeldung/other.xml :
GET /rest/baeldung/other.xml HTTP/1.1
Authorization: Basic YWRtaW46TmV3UGFzc3dvcmQ=
---
HTTP/1.1 200 OK
Content-Type: application/xml; charset=UTF-8
<?xml version="1.0"?>
<site>
<regions>
<africa>
...
</closed_auction>
</closed_auctions>
</site>
5.5. 查詢資源
除了簡單地檢索我們添加到資料庫的所有資源之外,我們還可以對它們執行查詢以傳回我們感興趣的資料。
我們可以使用 URL 上的query參數進行簡單的查詢。我們可以針對單一資源或整個資料庫執行此操作:
GET /rest/baeldung?query=//item/name HTTP/1.1
Authorization: Basic YWRtaW46TmV3UGFzc3dvcmQ=
---
HTTP/1.1 200 OK
<name>duteous nine eighteen </name>
<name>great </name>
...
<name>practice space commune women </name>
<name>holds perhaps despair amorous </name>
請注意,在這種情況下,我們得到的回傳結果與在命令列客戶端中執行查詢的結果完全相同。這意味著它不是一個單一的 XML 文檔,而是查詢輸出的流-在本例中是一組與查詢匹配的 XML 元素。
我們也可以透過 HTTP POST 呼叫提供更複雜的 XQuery 查詢:
POST /rest/baeldung HTTP/1.1
Authorization: Basic YWRtaW46TmV3UGFzc3dvcmQ=
Content-Type: application/xml
<query xmlns="http://basex.org/rest">
<text><![CDATA[ for $i in (//city/name)[position() <= 5] return string-length($i) ]]></text>
</query>
---
HTTP/1.1 200 OK
6
7
6
5
7
此查詢將傳回 XPath //city/name中前五個條目的長度,該查詢在整個資料庫中執行。和之前一樣,這不是單一 XML 文檔,而是查詢返回值的流。
5.6. 操作資源
除了查詢資源之外,我們還可以建立和更新資源。我們可以使用PUT方法將整個 XML 資源作為請求主體傳送至所需資源:
PUT /rest/baeldung/new.xml HTTP/1.1
Authorization: Basic YWRtaW46VGhlUGFzc3dvcmQ=
Content-Type: application/xml
<?xml version="1.0" standalone="yes"?>
<site>
<regions>
<africa>
...
</closed_auction>
</closed_auctions>
</site>
如果該資源已存在於資料庫中,我們將取代它。如果不存在,我們將創建一個新的。
我們可以用相同的方式刪除資源,使用資源上的DELETE方法:
DELETE /rest/baeldung/new.xml HTTP/1.1
Authorization: Basic YWRtaW46VGhlUGFzc3dvcmQ=
一旦完成,這些變更就可以立即供查詢,就像我們資料庫中的任何其他資料一樣。
6. 總結
在本文中,我們快速了解了 BaseX 資料庫系統。該系統還有更多功能等著我們實現。下次您的應用程式需要查詢和操作大量 XML 資料時,不妨嘗試一下。