若要將 XML 轉換為 CSV,XML to CSV Converter 會直接在您的瀏覽器中,把一組可預期的重複記錄元素攤平為矩形的逗號分隔表格,無需上傳文件。您只需貼上格式正確的 XML,輸入重複元素的精確限定名稱(例如 item 或 ns:item),工具就會透過瀏覽器的 DOMParser 逐一走訪每個符合項,將每一筆記錄轉成一行。記錄元素上的屬性會成為以 @ 為前綴的欄位,直接子元素會以其精確的標記名稱作為欄位,而任何在同一筆記錄中出現超過一次的子元素,則會被收合成一個精簡的 JSON 陣列,置於單一 CSV 儲存格內。輸出遵循 RFC 4180 規範(逗號、CRLF 換行,以及內嵌引號使用雙引號),且預設的公式保護選項會在以 =、+、- 或 @ 開頭的值前,加上定位字元置於引號欄位內,以防止試算表意外執行公式,此做法遵循 OWASP 的緩解指引。由於解析與序列化都在本機執行,XML 文件從不離開此頁面。

convert xml to csv
Convert XML to CSV Without Losing Repeated Fields

何時需要將 XML 轉換為 CSV

XML 以樹狀結構儲存記錄;CSV 則以列儲存記錄。這種結構上的差異,正是大多數人搜尋將 XML 轉換為 CSV 方法的主要原因。企業型錄、產品摘要、會計匯出、組態傾印,以及 SOAP 風格的回應,皆以巢狀標記的形式送達,但試算表、資料倉儲或下游腳本所要求的,是一份只有一行標頭、每行一筆紀錄的扁平檔案。嘗試在 Excel 或 Numbers 中強行開啟 XML,通常會產生一個單一欄位、且原始標記仍嵌入其中的檔案,這對分析毫無助益。

XML to CSV Converter 解決了文件包含一個作為列邊界之重複元素的常見情境。試想一個含有多個 <item> 元素的型錄檔案、一份含有多個 <product> 元素的價目表,或是一份含有多個 <entry> 元素的摘要檔。一旦您告訴工具哪個標記是記錄,它就能產生一個矩形表格。由於解析與序列化都在瀏覽器中進行,因此文件從不上傳;對於不應離開本機的內部匯出與客戶端資料而言,這一點至關重要。

轉換器如何將 XML 對應至 CSV 欄位

此對應方式刻意保持可預期性。您輸入的限定名稱所比對到的每個記錄元素,都會成為一列。在該筆記錄中,工具會走訪屬性與直接子元素,並根據其在整份文件中看到的內容,產生一組確定性的欄位聯集。

記錄中的 XML 結構CSV 欄位處理方式
記錄元素上的屬性 (id="42")欄位名稱為 @id,內容為屬性值
單一直接子元素 (<price>9.99</price>)欄位名稱為 price,內容為去除空白後的文字
同一個直接子元素重複出現 (<tag>a</tag><tag>b</tag>)一個名稱為 tag 的欄位,其值為精簡 JSON 格式的 ["a","b"]
子元素下的巢狀標記攤平為子代文字內容;結構與子屬性不會保留
任何子元素以外的直接文字僅在並非純粹空白時,才會成為一個 #text 欄位
後續記錄中缺少的欄位留空;欄位順序依照首次出現的聯集而定
頂端的 DOCTYPE 宣告在解析前予以拒絕;轉換器不會處理 DTD 預設值或外部實體
格式錯誤的標記、引號或實體解析器會回傳錯誤文件,並中止轉換

欄位順序具有確定性:第一筆記錄中的欄位會先出現,而稍後記錄中先前未見過的欄位則會附加在後。CSV 的第一列即是由該聯集所構成的標頭列,這就是為何您在試算表中看到的欄位數,應對應於所有記錄中標記與屬性的聯集,而非僅僅是第一筆記錄的內容。

三個步驟將 XML 轉換為 CSV

只要您的 XML 是乾淨的,整個工作流程大約只需一分鐘即可完成。

  1. 在瀏覽器中開啟 XML to CSV Converter。將完整的 XML 文件貼到輸入區。解析器會將輸入視為 application/xml,因此請確認文件格式正確:標記對應、引號平衡、實體有效。格式錯誤的輸入會回報錯誤並中止轉換,而非默默截斷。
  2. 輸入重複記錄元素的精確限定名稱。對於扁平的型錄,請使用裸標記,例如 item;對於帶有命名空間的摘要,請使用其在標記中實際出現的前綴,例如 ns:item。比對作業區分大小寫,且底層使用 getElementsByTagName,因此拼字錯誤或大小寫不符時,將回傳零列並顯示「未符合」錯誤。
  3. 若 CSV 將由真人於 Excel、Google Sheets 或 Numbers 中開啟,請保留公式保護。點擊「轉換」後,請先根據來源 XML 核對記錄數與欄位數,再進行下載或複製。下載的檔案為無位元組順序標記的純 UTF-8 text/csv。

若您的文件含有多個可能的列元素,請為每個候選標記各執行一次轉換,並比較其記錄數。與來源中預期記錄數相符的那一個,就是您的列邊界。

輸出格式、編碼與公式保護

CSV 輸出遵循 RFC 4180 所記載的規範。欄位以逗號分隔,記錄使用 CRLF 換行,包含逗號、雙引號、定位字元、歸位字元或換行字元的欄位會以雙引號包裹,而內嵌的雙引號則會以兩個雙引號表示。欄位中的空格會予以保留。缺少的欄位會留空,而非跳過儲存格,這使得跨列的欄位數保持穩定。

當目的地為試算表時,有兩項安全細節值得留意。首先,試算表程式可能會將以 =、+、- 或 @ 開頭的儲存格視為公式,並在開啟檔案時予以執行;這正是 OWASP 所追蹤的 CSV 注入手法。保護選項預設為啟用,會在引號欄位內將那些值前置一個定位字元,此為針對 Excel 設計的緩解措施。此機制會刻意變更儲存格資料,因此僅在下游消費者將所有儲存格皆視為惰性文字、或您需要逐位元組精確的原始值時,才應停用此選項。其次,下載的檔案為無位元組順序標記的 UTF-8 text/csv。大多數現代試算表皆可正確開啟,但某些舊版組態可能需要匯入精靈或明確指定 UTF-8。日期、數字、前導零、識別碼與布林值,會保留其在 XML 中的文字形式;試算表在開啟檔案時仍可能自動猜測型別,因此在前導零或數值精度必須保留時,請以受控的欄位型別進行匯入。

硬性限制、錯誤與結果核對方式

轉換器會在失敗時中止而非截斷,這能確保下游消費者的安全,但也意味著您應預先評估輸入的規模。

限制項目數值
XML 輸入大小500,000 characters
符合的記錄數10,000
輸出中的欄位數200
CSV 輸出大小5,000,000 characters

當轉換失敗時,原因通常出在以下三者之一:解析器錯誤代表 XML 格式不正確,請修正標記、引號或實體後重試;「未符合」錯誤代表限定的記錄名稱有誤或大小寫不同,請開啟文件並複製精確的標記字串(包含任何命名空間前綴);DOCTYPE 遭拒代表文件宣告了 DTD,請移除該 DOCTYPE 行,因為轉換器刻意不處理外部實體、DTD 預設值或自訂實體定義。轉換成功後,請在試算表中比對列數與欄位數與來源 XML 是否一致,再將該檔案視為正式匯出檔。

此轉換器不適用的情境

XML 並沒有一個通用的「記錄對表格」對應方式,而此轉換器也不試圖自行發明。它專為可預期的摘要所打造,例如由重複 item 元素組成、且子元素為純量文字的型錄。它不會自動推斷記錄、不會將巢狀陣列展開為多列、不會將父項值串接至子項、不會評估 XPath、不會正規化命名空間、不會保留 XSD 型別、不會依結構描述進行驗證,也不會在不失真的前提下轉換任意的混合內容文件。當同一份資料必須在經歷上述任何一種轉換後仍須保留時,應採用明確的管線,例如 XSLT、以程式碼實作的串流解析器,或專用的 ETL 工具,方為正確的對策。當您的文件已具備扁平、可預期的結構,且目標只是快速、私密、可立即複製的表格時,請使用本工具。

若想進一步了解,請參閱 Check XPath in Chrome Console Against Any XML

若想進一步了解,請參閱 How to Convert XML to JSON in Notepad++