將 XML 檔案轉換為 CSV 意味著將一份結構化文件攤平為一個矩形表格,每一列代表一筆記錄,每一欄代表一個屬性或子元素的值,全部以純逗號分隔的文字呈現。XML to CSV Converter 能在您的瀏覽器中完成這項工作:您貼上格式正確的 XML 文件,並指定會重複出現的限定標籤名稱作為記錄元素,轉換器就會逐一走訪所有相符的元素,依據 RFC 4180 的 CSV 輸出規範,建構出一個具確定性的欄位集合。解析與序列化皆在本機進行,因此來源文件永遠不會被上傳,您可以直接將結果複製到剪貼簿,或下載為不含位元組順序記號的 UTF-8 text/csv 檔案。這種做法適用於可預期的 XML 資料來源,例如型錄、RSS 風格的匯出檔,或重複元素僅共用少量純量子元素的 REST 酬載;不過此工具不會自動推斷記錄,因此選擇正確的記錄名稱是唯一會決定所有欄位的關鍵決定。

convert xml to csv file
Convert XML to CSV File Without Uploading It

轉換器如何從您的 XML 建構結果

轉換器會將每一個標籤名稱與您所提供之限定名稱完全相符的元素視為一筆記錄。如果您輸入的是 item,那麼只有 <item> 元素會成為列;<product> 元素或帶有命名空間的 <item> (例如 ns:item) 都不會被比對到,因為比對作業區分大小寫,並必須透過 getElementsByTagName 完整保留任何前綴。

在每一筆相符的記錄中,轉換器會區分三種資料來源:記錄元素上的屬性、直接子元素,以及任何非純粹空白的直接文字。屬性會成為以 @ 開頭命名的欄位,因此像 <item id="42" sku="A1"> 這樣的記錄會產生 @id 與 @sku 兩個欄位。像 <name>Widget</name> 這樣的直接子元素,則會產生一個名為 name、內容為去除前後空白後文字 Widget 的欄位。若某個直接子元素重複出現,例如在一個 <item> 內有三個 <tag> 元素,則會以精簡的 JSON 陣列形式保存在同一個 CSV 儲存格中,因此當同一個子元素名稱出現多次時,不會有任何資料被悄悄遺漏。

巢狀標記會被攤平為子代文字。若一筆記錄為 <description>Light <b>blue</b> cotton</description>,則 description 欄位會收到字串 Light blue cotton,而不保留任何標記界線、子元素屬性、註解、處理指令,或混合內容的順序。這是刻意的設計選擇:轉換器產生的是矩形表格,而非忠實還原的 XML 往返結果。

如何在瀏覽器中將 XML 檔案轉換為 CSV

  1. 在瀏覽器中開啟 XML to CSV Converter,並將格式正確的 XML 文件貼入輸入區。瀏覽器會以 application/xml 的 MIME 類型透過 DOM 解析器進行解析,若文件格式錯誤,則會回傳錯誤文件並阻止轉換。
  2. 輸入重複記錄元素的精確限定名稱,例如 item、product 或 ns:item。轉換器會依照您提供的前綴進行區分大小寫的比對,因此拼字錯誤或前綴不正確都會導致產出零列。
  3. 決定是否啟用試算表公式防護功能。此選項預設為開啟,會在以雙引號括起的欄位內,以一個定位字元 (tab) 作為前置字元,加在以 =、+、- 或 @ 開頭的值之前,以遵循 OWASP 所討論、以 Excel 為導向的緩解措施。凡是將由人類在 Excel 或 Google 試算表中開啟的 CSV,請保持此功能開啟;只有在目的地會將每個儲存格視為靜態文字,並且您需要精確的原始值時,才將其關閉。
  4. 點擊 Convert。轉換器會逐一走訪所有相符的元素,從第一筆記錄開始建立具確定性的欄位集合,攤平每一列,並將結果序列化。
  5. 核對工具所顯示的記錄數與欄位數是否與您的來源一致。一個簡單的健全性檢查,是比較 XML 中開頭記錄標籤的數量與 CSV 中的列數 (再扣掉標頭那一列)。
  6. 將 CSV 複製到剪貼簿,或下載為 UTF-8 text/csv 檔案。在試算表中開啟後,檢查任何內容為 JSON 陣列的儲存格,以確認重複出現的子元素皆已保留下來。

欄位如何對應屬性、子元素與重複元素

XML 記錄中的來源CSV 欄位名稱儲存格內容
<item id="42"> 屬性@id42
<name>Widget</name> 直接子元素nameWidget
重複出現的直接子元素,例如三個 <tag> 元素tag["a","b","c"] 精簡 JSON 陣列
<item>note<name>X</name></item> 直接非空白文字#textnote
僅出現在後續記錄中的元素附加於現有欄位之後在較早的列中為空
像 <desc>A <b>B</b> C</desc> 的巢狀標記descA B C 攤平後的文字

欄位順序具確定性:第一筆記錄中出現的欄位會先輸出,而後續記錄中任何先前未出現的欄位,則會依其首次出現的順序附加於末尾。若記錄 1 擁有 @id、name 與 price 這幾個欄位,而記錄 7 引入 stock 欄位,則輸出中的每一列皆會在末端新增一個 stock 欄位,而記錄 1 到 6 則會將其留空。這種可預期的順序對於跨匯出檔的差異比對,以及對於假設標頭固定的匯入工具而言,都至關重要。

公式防護與試算表安全輸出

CSV 輸出遵循 RFC 4180 規範:欄位以逗號分隔,記錄使用 CRLF 換行符號,而任何包含逗號、雙引號、定位字元 (tab)、歸位字元 (CR) 或換行字元 (LF) 的欄位,皆會以雙引號括起,內部的雙引號則會重複一次。值內部的空格會予以保留。第一列為根據具確定性欄位集合所建立的標頭列,而缺失的欄位則會以空欄位呈現,而不是略過分隔符號。

試算表程式可能會將以 =、+、- 或 @ 開頭的儲存格解讀為公式,這是眾所周知的 CSV 注入 (CSV injection) 手法。在預設啟用的公式防護下,轉換器會在以雙引號括起的欄位內,於這些值的前面加上單一定位字元 (tab),藉此在 Excel 中抵銷公式的解讀,同時在底層文字中保留原始字元。唯有在您將 CSV 餵入會將每個儲存格視為靜態文字、並且需要精確原始字串的工具時,才應停用此選項。此緩解措施遵循 OWASP 以 Excel 為導向的指引,並非對所有試算表或程式化匯入工具的通用保證。

下載的檔案為不含位元組順序記號的純 UTF-8 text/csv。部分舊版試算表設定可能需要匯入精靈或明確選用 UTF-8;XML 中日期、數字、前導零、識別碼與布林值的拼法在 CSV 中仍保持為文字,因此任何試算表在開啟檔案時仍可能自行猜測資料型別。當必須保留前導零或數值精度時,請以受控的欄位型別進行匯入。

限制、錯誤以及不會執行的轉換

轉換器強制設有嚴格的限制,並在超過時直接失敗而非截斷。輸入上限為 500,000 個 XML 字元、10,000 筆相符記錄、200 個欄位,以及 5,000,000 個 CSV 字元。超出任何上限的文件會回傳錯誤而非部分 CSV,藉此避免在正式匯出流程中發生靜默的資料遺失。

解析規則相當嚴格。瀏覽器必須將輸入接受為 application/xml;格式錯誤的標籤、未跳脫的引號,以及錯誤的實體,皆會回傳錯誤文件並阻止轉換。DOCTYPE 宣告會在解析之前遭到拒絕,因此本工具不會處理外部實體、DTD 預設值或自訂實體定義,這是一道刻意的安全界線。命名空間會依您所輸入的限定名稱以字面意義進行比對,而非正規化處理。

XML 並不具備通用的記錄對表格對應方式,因此轉換器做出了明確的選擇,而不嘗試加以推斷。它不會自動偵測記錄、不會將巢狀陣列展開為多列、不會將父元素的值合併至子列、不會評估 XPath、不會正規化命名空間、不會保留結構描述型別、不會根據 XSD 進行驗證,也無法在零損耗的前提下轉換任意的混合內容文件。若您的來源看起來不像是一連串具有純量子元素的重複元素,例如 <item> 節點構成的型錄、<entry> 節點構成的摘要,或 <order> 節點構成的清單,請改用明確的 XSLT 樣式表或應用程式碼來處理。

驗證您的 CSV 與來源的一致性

在錯誤擴散之前最快速的偵錯方式,就是進行並排比對。請計算來源 XML 中所選記錄元素的開頭標籤數量,並確認其與 CSV 中的資料列數一致 (標頭列不計在內)。比較第一筆記錄中相異屬性名稱加上相異直接子元素名稱的數量,是否與標頭列相符,並確認您預期出現的欄位皆以您預期的順序存在。

在試算表中開啟 CSV,捲動到一筆您熟悉其內容的記錄,並檢查其儲存格。以 [ 開頭的儲存格代表重複子元素的 JSON 陣列;請展開檢查,以確認完整的集合皆已保留下來,而非被悄悄摺疊為單一值。以定位字元 (tab) 開頭的儲存格代表公式防護已啟動,這在供人類閱讀的匯出檔中是預期且安全的行為。

若輸入較大,請從檔案不同位置抽樣數筆記錄。檔案開頭附近的記錄決定了欄位順序,中間的記錄通常會引入新欄位,而靠近結尾的記錄則會對具確定性的欄位集合造成壓力。若您需要的欄位未出現在標頭中,可能是記錄名稱未能比對到所有出現位置,因此在替換正式匯出檔之前,請再次檢查限定名稱是否有拼字錯誤或前綴不符的情形。

若您正在權衡各種選擇,Convert XML to JSON for OIC: A Local Browser Workflow 對此有詳細介紹。

若您正在權衡各種選擇,Convert CSV to HTML Table in JavaScript: A Safe Workflow 對此有詳細介紹。