科技 · 實用指南
將 digiKam 已選照片 XML 清單轉為 CSV,保留完整路徑
把每筆顯示 URL 和重複檔名保留為試算表快照,不複製照片,也不把選取清單當作匯出成功證明。

需要 digiKam 已選照片的表格時,直接列資料夾不是同一個結果:它可能包含未選檔案,也丟失剛做的選取。匯出工具的「儲存清單」可以得到 XML 選取快照。
以下離線轉換把完整顯示 URL 及順序保留為兩欄 CSV。它不複製照片、不查詢資料庫、不保存全部照片中繼資料,也不證明之後的照片匯出成功。
儲存工具清單,不啟動照片匯出
先選目標照片,再開啟「匯出 > 匯出到本機儲存空間」。目前手冊說明視窗初始包含圖示檢視中已選項目。核對視窗實際清單與數量:篩選、分組、新增項目或過期選取,都可能使它與預期不同。
若檔案清單下方有「儲存清單」控制項,儲存為新的本機 selection.xml。原使用者討論記錄此控制項,目前完整儲存函式寫入 Images 根節點與帶 url 屬性的 Image 項目。你的版本若無此控制項或格式不同,就停止,不把任意 XML 當作同一清單。我們未執行目前的 digiKam 介面。
只需要清單時,關閉視窗,不啟動照片傳輸。本機匯出可複製、連結、調整大小或改變匯出中繼資料,這些是另一步。保留原 XML,另記 digiKam 版本、選取用途、時間及清單數量。離線轉換不需修改原照片或資料庫。
轉換自己產生的 UTF-8 XML 副本
只使用自己儲存的清單,不使用他人提供的 XML。安裝 Python 3 後,在 Linux Bash 終端機進入 selection.xml 所在目錄,把下一命令複製為一行,保留直引號與反斜線。選擇新 CSV 名;已存在的輸出會被拒絕。
python3 -c "exec('import csv\\nimport pathlib\\nimport sys\\nimport xml.etree.ElementTree as ET\\n\\nraw = pathlib.Path(sys.argv[1]).read_text(encoding=\"utf-8-sig\")\\nif \"<!DOCTYPE\" in raw.upper():\\n raise ValueError(\"Use only your own saved list without a DOCTYPE\")\\nroot = ET.fromstring(raw)\\nitems = root.findall(\"Image\")\\nif root.tag != \"Images\" or not items or len(list(root.iter(\"Image\"))) != len(items):\\n raise ValueError(\"Expected Images with direct Image entries, not nested images\")\\nurls = [item.get(\"url\") for item in items]\\nif any(not isinstance(url, str) or not url for url in urls):\\n raise ValueError(\"Every Image must have a nonempty url\")\\nwith open(sys.argv[2], \"x\", encoding=\"utf-8-sig\", newline=\"\") as destination:\\n writer = csv.writer(destination)\\n writer.writerow([\"ordinal\", \"url_display\"])\\n writer.writerows(enumerate(urls, 1))\\nwith open(sys.argv[2], encoding=\"utf-8-sig\", newline=\"\") as output:\\n parsed = list(csv.reader(output))\\nif parsed != [[\"ordinal\", \"url_display\"]] + [[str(i), url] for i, url in enumerate(urls, 1)]:\\n raise ValueError(\"Output did not round-trip: discard it and use a new output name\")\\nprint(len(urls), \"selection records exported and read back; not an export receipt\")\\n')" "selection.xml" "selection.csv"
兩欄為 ordinal 與 url_display。ordinal 從 1 開始按 XML 項目順序編號,是快照列識別碼,不是 digiKam 資料庫圖片 ID。建立輸出前驗證 Images 根節點、直屬 Image 項目及每筆非空 url;拒絕巢狀 Image 或 DOCTYPE。外掛設定和項目額外屬性刻意不匯出,因此保留 XML。
保留 URL 原文字並核對資料列
digiKam 寫入 QUrl 的顯示形式。XML 解析只把 & 等標記轉回屬性文字一次,之後不拆路徑、不解碼百分號序列、不修剪也不去除重複。顯示 URL 不會自動成為本機路徑或命令,不要將儲存格貼進複製、更名或刪除檔案的命令。
不同目錄中的相同檔名仍是獨立完整 URL,完全重複的 URL 也保留獨立紀錄。命令回讀 CSV,逐筆比對序號與 URL 後才印出成功。對照儲存時工具清單數量,檢查多個完整 URL,尤其不同目錄裡的同名檔案。這可驗證已存紀錄的轉換,不能發現最初漏選照片。
在 LibreOffice Calc 選擇 UTF-8、逗號分隔及直雙引號文字分隔符號。關閉「合併分隔符號」「修剪空格」「計算公式」,兩欄都設「文字」。視窗未出現時,開啟時啟用「編輯篩選器設定」。另用副本排序篩選,保留未改 CSV 主副本。
處理錯誤,區分選取與交付證據
XML 格式錯誤、根節點錯誤、空清單、遺漏 URL 或巢狀 Image 會在建立輸出前停止。目標已存在就換新名;寫入或回讀失敗時,棄用不完整 CSV,換新名重跑。磁碟上出現檔案不代表成功。HTML 圖庫說明或資料庫匯出等其他 XML 不適用。
我們實際用這條準確 Linux Bash 命令執行 13 項模擬案例,涵蓋 Unicode、逗號引號、重複名稱及 URL、原百分號序列、Windows/網路 URL 文字、錯誤輸入及刻意略去外掛資料。五項有效雙紀錄案例還各自驗證二次寫入被拒絕且輸出不變。未執行 digiKam、Qt 或 Calc,也未在 Windows/macOS 執行命令。
儲存清單只記錄當時已選項目。確認實際交付仍需另查匯出結果及目標檔案;這個 CSV 沒有成功狀態或雜湊。需要可重複使用的圖庫選取時,已有標籤與標記仍是可用方法。需要完整標題、評分等中繼資料時,改用相應中繼資料或資料庫流程,不假設兩欄快照包含這些內容。
