我建造 工具。dev10 年前,我在 WordPress 和 Laravel 工作中經常做的工作是將資料輸入到設計的系統中。他們中的許多人仍然講 XML,而且只講 XML:市場的產品來源、會計包的導入格式、不會查看其他任何內容的 SOAP 端點。資料幾乎總是以 CSV 匯出形式從電子表格到達,因此任務是將平坦的逗號分隔的行轉換為結構化的 XML 文件。我親眼目睹了這在各方面都出了問題,從包含分成兩列的逗號的客戶名稱到公司名稱中的放大器,導致整個文件無法解析。這 CSV 到 XML 轉換器 存在是為了在瀏覽器中正確進行轉換,而無需將客戶清單貼上到某個匿名伺服器中。本指南涵蓋了轉換涉及的內容、為什麼棘手的部分很棘手,以及如何為要讀取的內容塑造輸出。
TL;DR: CSV 到 XML 轉換器讀取逗號分隔的行並將它們寫入格式良好的 XML 文檔,每行都成為一個元素,每個單元格都成為一個命名的子元素或屬性。它根據 RFC 4180 解析 CSV,因此包含逗號、引號或換行符的引用欄位完好無損地保存下來;它會自動偵測分隔符號是逗號、分號、製表符還是管道;它強制將列名稱轉換為有效的 XML 標籤;它會轉義標記有效字符,因此輸出始終解析。它完全在您的瀏覽器中運行,因此 CSV 中的資料永遠不會上傳。
CSV 和 XML 有什麼不同?
CSV,逗號分隔值,是一種平面文字格式。每行都是一筆記錄,在一行內每個欄位都由一個分隔符號(通常是逗號)分隔。它很緊湊,每個電子表格都可以匯出它,人類閱讀起來很簡單。它不能做的是表達結構或意義。 CSV 中沒有任何內容說明列的含義,沒有嵌套,沒有類型;一個細胞持有 true 還有一個牢房裡藏著這個詞 true 無法區分,本身包含逗號的值需要特殊引用以避免被讀作兩個欄位。
XML,即可擴展標記語言,是相反的交易。每個值都包裹在一個命名標籤中,因此 <name>Ada Lovelace</name> 帶有它的價值和標籤。這種冗長的購買結構:元素嵌套,可以根據模式驗證文檔,樣式表可以改變整個事物。其中列出了計算什麼以及格式良好的 XML 的規則 W3C XML 1.0 規格,而且它們在 CSV 從來都不是嚴格的方式,這正是機械轉換必須小心的原因。將 CSV 轉換為 XML 從根本上來說就是添加 CSV 隱式留下的結構和轉義。
行如何成為元素?
自然映射將第一個 CSV 行視為標題,保留列名稱,將後面的每一行視為一個記錄。每個記錄都變成一個行元素,在其內部每個單元格都變成一個以其列命名的子元素。所以 CSV 的 id,name,role 帶有一個資料行 1,Ada Lovelace,Engineer 變為:
<rows>
<row>
<id>1</id>
<name>Ada Lovelace</name>
<role>Engineer</role>
</row>
</rows>
外層 rows 元素是文件根,因為格式良好的 XML 文件必須恰好有一個頂級元素來包裝其他所有內容。轉換器可讓您重新命名根元素和每行元素,以便您可以產生 <catalog><product>...</product></catalog> 相反,當這是您的目標所期望的時。列名稱變成標籤名稱,這是第一個真正的約束咬合的地方,因為並非每個列標題都是合法的 XML 標籤。
為什麼某些列名稱會更改?
XML 元素名稱不是自由形式的。該規範規定,名稱必須以字母或下劃線開頭,然後可能包含字母、數字、連字符、句點和下劃線,但不包含空格和大多數標點符號,並且可能不會以數字開頭。稱為電子表格列 First Name 或者 Unit Price ($) 或者 2024 Total 是一個非常好的標題和非法的 XML 標籤。如果轉換器發出 <First Name> 該文件根本無法解析。
因此,該工具將每個列名稱清理為有效標籤。空格和非法字元成為下劃線,因此 First Name 成為 First_Name,以數字開頭的名稱會得到下劃線前綴,因此 2024 Total 成為 _2024_Total. 如果兩列清理到同一標籤,或者標題真正重複一個名稱,則重複項會獲得一個數字後綴,因此沒有一列默默地覆蓋另一個標籤,並且工具在完成此操作時會警告您。重要的保證是僅調整標籤名稱;每個單元格內的資料都會保持不變。如果您需要準確保留原始標籤,下面介紹的屬性模式通常更適合,因為屬性名稱面臨相同的規則,但您也可以選擇將標題作為值攜帶到其他地方。
值內的逗號和引號怎麼樣?
這是打破樸素轉換器的部分,值得理解。 CSV 有一個引用約定,正式化為 RFC 4180,對於包含分隔符號或換行的值。這樣的值被雙引號包裹,其中的任何文字雙引號都寫成兩個雙引號。所以公司現場控股 Hopper, Grace 儲存在 CSV 中 "Hopper, Grace",還有註釋閱讀 she said "hi" 儲存為 "she said ""hi""".
將逗號上的每一行分開的轉換器將破壞這兩行,將一個欄位變成兩個欄位並留下到處都是雜散的引號。該工具使用適當的狀態機解析器來追蹤它是否位於引用欄位內,因此嵌入逗號、嵌入引用,甚至引用值內的換行符都會被讀取為它們所屬的單一欄位的一部分。這就是指定客戶之間的差異 Smith, John 作為一者到達 <name> 元素並以破損記錄的形式到達,並帶有額外的列。如果您的匯出來自 Excel、Google Sheets 或資料庫轉儲,則幾乎可以肯定它會使用此引用,並且正確解析它不是可選的。
一旦該值被安全解析,它仍然必須對 XML 變得安全,這是一個單獨的轉義問題。 XML 中有五個字元是特殊的,元素文字中重要的三個字元是&號、小於號和大於號。包含的單元格 Ben & Jerry's 或者 x < y 如果按字面意思編寫,將產生無效的 XML,因此轉換器會用預先定義的實體替換它們 &, <, 和 >. 在屬性值中,雙引號也被轉義。無論資料包含什麼內容,這種轉義都保證輸出解析。
每個單元格應該是一個元素還是一個屬性?
XML 為您提供了兩個放置值的位置:作為子元素的文本,或作為行元素上的屬性。轉換器支援兩者,哪一個是正確的完全取決於讀取檔案的系統。元素模式產生可讀、可嵌套的形式:
<row>
<name>Ada</name>
</row>
屬性模式將整行折疊成單一自閉元素:
<row name="Ada" role="Engineer"/>
以下是兩者在通常決定它的維度上的比較:
| 考慮 | 兒童元素 | 屬性 |
|---|---|---|
| 可讀性 | 更高,每行一個值 | 密度大,每行一行 |
| 文件大小 | 更大,標籤重複 | 較小的 |
| 可以稍後再築巢 | 是的 | 不 |
| 每列重複值 | 允許 | 每個屬性名稱一個值 |
| 典型合身 | 文檔式的數據,提要 | 記錄緊湊,配置緊湊 |
根據經驗,如果資料是記錄式的、扁平的,而讀者想要它很小,那麼屬性就很好;如果資料稍後可能會發展結構,或者人類會讀取它,則元素是更安全的預設值。當您不確定消費系統想要什麼時,元素是更保守的選擇,因為任何接受屬性的東西也可以適應元素,但反之則並不總是如此。
如何使用 CSV 到 XML 轉換器
第 1 步:貼上您的 CSV
將 CSV 貼上或輸入輸入框。直接從 Excel 或 Google Sheets 複製的區塊可以運行,a 的內容也可以 .csv 文件,包括包含逗號或換行符的引用欄位。
第 2 步:設定選項
將分隔符號留在自動偵測上或明確選擇一個,確認第一行是標頭,設定根和行元素名稱,並選擇每個儲存格是否成為子元素或屬性。您也可以切換 XML 聲明並在縮排輸出和縮小輸出之間切換。
第三步:轉換
點擊轉換為 XML。該工具解析每一行,將列名稱清理為有效標籤,轉義標記字符,並組裝格式良好的文檔,警告您有關任何重新命名的列或參差不齊的行。
第四步:複製或下載
將 XML 複製到剪貼簿或下載為 .xml 文件。如果形狀不太適合目標系統,請調整元素名稱或在元素和屬性模式之間切換並再次轉換。
為什麼要自動偵測分隔符號?
並非每個&引用; CSV&引用;被逗號分隔。來自歐洲地區的出口經常使用分號,因為逗號是這些區域中的小數分隔符,並且從資料庫或日誌中提取的資料通常是製表符分隔的。鎖定逗號的轉換器會將分號檔案讀取為單一寬列並產生無意義。該工具透過嘗試逗號、分號、製表符和管道並選擇在前幾行中產生一致列計數的值來檢測分隔符,這是比原始頻率更可靠的訊號,因為散文中的逗號經常出現但不規則。當文件不尋常時,您始終可以覆蓋猜測,但對於常見情況,檢測意味著您貼上然後離開。
參差不齊的行,其中一行的字段比標頭更多或更少,是現實世界中的另一個混亂。轉換器會用空元素填充短行並警告您,而不是默默地丟棄數據,因此您可以看到第 47 行缺少最後兩個字段,而不是在下游發現它。標頭之外的額外欄位會取得通用列名稱,因此不會遺失任何內容,警告會告訴您到底有多少行受到影響,這通常足以將問題追溯到來源中的雜散分隔符號。如果您想在轉換之前檢查一個混亂的文件,則 CSV 檢視器 將其呈現為具有相同容許解析器的表,這通常是在雜散分隔符號或未閉合引號變成格式錯誤的輸出之前發現它的最快方法。
CSV 到 XML 轉換器與其他所有轉換器都適合
資料轉換很少是單跳。今天需要成為 XML 的相同 CSV 明天可能需要成為 REST API 的 JSON,或資料庫載入的一批 SQL 插入。這 CSV 到 JSON 轉換器 使用相同的 RFC 4180 解析器處理 JSON 目標,並且 CSV 到 SQL 轉換器 將相同的行轉換為插入語句。當資料已經是 XML 並且您需要走另一條路時, XML 到 JSON 轉換器 和 JSON 到 XML 轉換器 涵蓋 XML-JSON 邊界的兩個方向,並且它們使用該工具遵循的相同屬性和文字約定,因此往返是可預測的。
為了更廣闊的視野, CSV 到 JSON 指南 深入研究解析相同的混亂導出, JSON 到 XML 指南 解釋了 JSON 側的元素和屬性映射,以及 線上工具中的資料隱私 文章解釋了為什麼當 CSV 保存姓名和電子郵件地址時,在瀏覽器中執行所有這些操作很重要。與 toolz。dev 上的所有內容一樣,轉換器完全在您的瀏覽器中運行,因此您轉換的資料永遠不會離開您的電腦。
常見問題
如何將 CSV 檔案轉換為 XML?
將 CSV 貼到輸入框中,確認分隔符號和標頭設置,然後按一下「轉換為 XML」。第一行被讀取為列名稱,後面的每一行都變成一個 XML 元素,其子標籤以這些列命名。然後您可以複製結果或將其下載為。xml 檔案。
CSV 頭行會發生什麼事?
當"第一行是 header"開啟時,標頭單元格將成為每個資料行的 XML 元素名稱。名稱被清理為有效的 XML 標籤,因此 "名字&引用;變成 First_Name,重複的列會重新命名並帶有數字後綴。如果關閉標題選項,列將命名為 column_1、column_2 等等。
每個單元格應該是一個元素還是一個屬性?
這取決於系統讀取 XML。元素模式寫入一個可讀的嵌套結構,每個值一個標籤,而屬性模式將一行折疊成一個緊湊的元素,每列一個屬性。此轉換器支援兩者,因此選擇您的架構或匯入目標期望的;當您不確定時,元素是更安全的預設值。
轉換器是否處理值內的逗號?
是的。根據 RFC 4180,包含逗號、雙引號或換行符的值在 CSV 中用雙引號包裝,嵌入的引號寫成兩個引號。解析器將這些引用的欄位讀取為單一值,而不是將它們分開,因此 "霍珀,格雷斯&引用;保持在一個元素中。
支援哪些分隔符號?
逗號、分號、製表符和管道。預設情況下,該工具會透過選擇在前幾行中產生一致數量的列的列來自動檢測分隔符,從而正確處理歐洲分號檔案和製表符分隔的匯出。您也可以手動選擇分隔符號。
為什麼我在 XML 中的一些列名稱發生了變化?
XML 元素名稱不能包含空格或大多數標點符號,也不能以數字或連字符開頭。轉換器用底線替換非法字符,並在以數字開頭的名稱前綴,因此輸出始終格式良好。每個單元格中的原始資料永遠不會更改,僅更改標籤名稱。
我的 CSV 資料是否上傳到伺服器?
不。整個轉換在您的瀏覽器中使用 JavaScript 運行。您貼上的任何內容都不會被傳輸、記錄或存儲,並且一旦頁面加載,該工具就會在沒有網路連接的情況下繼續工作,從而使 CSV 中的姓名、電子郵件和其他資料保持私有。
我可以將 XML 轉換回 CSV 或 JSON 嗎?
該工具將 CSV 轉換為 XML。要以其他方式重塑數據,請使用 XML 到 JSON 轉換器,並在目標為 JSON 而不是 XML 時使用 CSV 到 JSON 轉換器。所有這些都在具有相同隱私保證的客戶端運行。



