私が造る Toolz.dev、そして私が行うwordpressとlaravelの仕事全体で繰り返される仕事は、10 年か2 年前に設計されたシステムにデータをフィードすることです それらの多くはまだXMLとXMLだけを話します: 市場向けの製品フィード、会計パッケージのインポート形式、他のものを見ないSOAPエンドポイント データはほとんどの場合、スプレッドシートからCSVエクスポートとして到着するため、タスクはフラットカンマで区切られた行を構造化されたXMLドキュメントにするために、2 列に分割されたカンマを含む顧客名から、ファイル全体の解析に失敗する会社名のアンパサンドまで、あらゆる方法で間違った方向に進むのを見てきました CSVからXMLへのコンバーター 顧客リストを匿名サーバーに貼り付けることなく、ブラウザーでその変換を正しく行うために存在します。このガイドでは、変換に含まれる内容、トリッキーな部分がトリッキーである理由、読み取る出力をどのように形作るかについて説明します。
tl;dr: CSVからXMLへのコンバーターは、カンマで区切られた行を読み取り、整形式のXMLドキュメントとして書き、各行が要素になり、各セルが名前付きの子要素または属性のいずれかになります。 RFC 4180 ごとにCSVを解析するため、カンマ、引用符、改行を含む引用フィールドはそのまま残ります; 区切り文字がカンマ、セミコロン、タブ、またはパイプであるかどうかを自動検出します; 列名を有効なXMLタグに強制します; マークアップ重要文字をエスケープするため、出力は常にブラウザ内で完全に実行されるため、CSV内のデータがアップロードされることはありません。
CSVとXMLの違いは何ですか?
CSV、カンマ区切り値はフラットテキスト形式です 各行はレコードであり、行内では各フィールドは区切り文字、通常はカンマで区切られています コンパクトで、すべてのスプレッドシートがエクスポートでき、人間が読むのは些細なことです 構造や意味を表現することはできません CSVには、列の意味を言うものは何もありません ネスティングもタイプもありません; セル保持 true そしてその言葉を保持する独房 true は区別できず、カンマを含む値自体が 2 つのフィールドとして読み取られるのを避けるために特別な引用が必要です。
拡張マークアップ言語である XML は逆の取引です。すべての値は名前付きタグでラップされているため、 <name>Ada Lovelace</name> 値とそのラベル両方を担います その冗長性は構造を買います: 要素はネストし、文書はスキーマに対して検証でき、スタイルシートは全体を変換できます。 well-formed XMLとしてカウントするもののルールは、で設定されています W3C XML 1.0 の指定、そしてそれらは決してcsvではない方法で厳密です、それはまさに機械変換が注意しなければならない理由です。 CSVをXMLに変換することは基本的に、CSVが暗黙的に残す構造とエスケープを追加することです。
行はどのようにして要素になるのでしょうか?
自然なマッピングは最初のCSV行をヘッダーとして扱い 列名を保持し 続くすべての行を1 つのレコードとして扱い 各レコードは行要素になり その中で各セルは その列にちなんだ名前の子要素になります つまりCSVは id,name,role データ行 と 1,Ada Lovelace,Engineer となる:
<rows>
<row>
<id>1</id>
<name>Ada Lovelace</name>
<role>Engineer</role>
</row>
</rows>
の アウター rows 整形式の XML ドキュメントには、他のすべてをラップするトップレベルの要素が 1 つだけ含まれている必要があるため、要素はドキュメント ルートです。コンバーターを使用すると、ルートと行ごとの要素の両方の名前を変更できるため、生成できます <catalog><product>...</product></catalog> 代わりに、それがターゲットが期待しているとき。列名はタグ名になり、すべての列見出しが合法的な XML タグであるわけではないため、最初の実際の制約が噛み付きます。
一部の列名が変更されるのはなぜですか?
XML要素名は自由形式ではない 仕様書では、名前は文字またはアンダースコアで始まる必要があり、その後、文字、数字、ハイフン、ピリオド、アンダースコアを含むが、スペースやほとんどの句読点を含まない場合があり、数字と呼ばれるスプレッドシートの列 First Name や Unit Price ($) や 2024 Total は完全に良い見出しで、不正な XML タグです。 コンバータが放出した場合 <First Name> ドキュメントはまったく解析されません。
したがって、ツールはすべての列名を有効なタグにサニタイズします。 spaces と illegal 文字はアンダースコアになるので、 First Name なる First_Nameと、桁で始まる名前はアンダースコア接頭辞 so を取得します 2024 Total なる _2024_Total.2 つの列が同じタグにサニタイズする場合、またはヘッダーが純粋に名前を繰り返す場合、重複は数値接尾辞を取得するため、列が別の列を静かに上書きすることはなく、ツールがこれを行ったときに警告する重要な保証は、タグ名のみが調整されることです; すべてのセル内のデータは、そのまま通過します。元のラベルを正確に保存する必要がある場合は、属性名は同じルールに直面しますが、見出しを他の場所に値として保持することも選択できるため、以下で説明する属性モードの方がよく適合することがよくあります。
値内のカンマと引用符はどうですか?
これはナイーブコンバータを壊す部分であり、理解する価値があります。 CSVには引用規則があり、で形式化されています RFC 4180、区切り文字や改行を含む値に対して、そのような値は二重引用符で包まれ、その中の任意のリテラル二重引用符は2 つの二重引用符で書かれるので、会社フィールドを保持します Hopper, Grace としてCSVに格納される "Hopper, Grace"、 と ノート 読み she said "hi" として格納される "she said ""hi"""。
コンマ上の各行を分割するコンバーターは、これらの両方をマングルし、1 つのフィールドを2 つに変えて、どこにでも迷走引用符を残します。 このツールは、引用符フィールド内にあるかどうかを追跡する適切なステートマシンパーサーを使用するため、埋め込みカンマ、埋め込み引用符、さらには引用符値内の改行はすべて、それらが属する単一フィールドの一部として読み取られるという、指定された顧客の違いです Smith, John 一つになって到着します <name> 要素と余分な列を持つ壊れたレコードとして到着します エクスポートがExcel、Google Sheets、またはデータベースダンプから出てきた場合、それはほぼ確実にこの引用符を使用し、それを正しく解析することはオプションではありません。
値が安全に解析されたら、XML に対しても安全にする必要がありますが、これは別のエスケープ問題です。 XML では 5 文字が特殊であり、要素テキストで重要な 3 文字は、アンパサンド、小数点以下の符号、および大数以上の符号を含むセルです Ben & Jerry's や x < y 文字通りに記述すると無効な XML が生成されるため、コンバータはそれらを事前定義されたエンティティに置き換えます &、 <、そして >。属性値では、二重引用符もエスケープされます。このエスケープは、データに何が含まれているかに関係なく、出力の解析を保証するものです。
各セルは要素であるべきですか、それとも属性であるべきですか?
XML は値を入れるための2 つの場所を与えます: 子要素のテキストとして、または行要素の属性として コンバータは両方をサポートし、どちらが正しいかはファイルを読み取るシステムに完全に依存します 要素モードは、読みやすく、入れ子可能なフォームを生成します:
<row>
<name>Ada</name>
</row>
属性モードは行全体を単一の自己閉じる要素に折りたたみます:
<row name="Ada" role="Engineer"/>
通常それを決定する次元で両者がどのように比較するかは次のとおりです:
| 考慮 | 子要素 | 属性 |
|---|---|---|
| 可読性 | より高く、1 行に 1 つの値 | より高密度で、1 行あたり 1 行 |
| ファイルサイズ | より大きな、タグが繰り返されました | 小さいです |
| さらに後で巣を作ることができます | はいって | いやー |
| 列ごとの繰り返し値 | 許可 | 属性名ごとに 1 つの値 |
| 典型的なフィット感 | ドキュメント スタイルのデータ、フィード | コンパクトレコード、コンフィグ |
経験則として、データがレコードのようにフラットで、読者が小さくしたい場合、属性は問題ありません; データが後で構造を拡大する可能性がある場合、または人間がそれを読む場合、要素はより安全なデフォルトであり、消費システムが何を望んでいるのかわからない場合、要素を受け入れるものはすべて要素に適応できるため、要素はより保守的な選択ですが、その逆は常に当てはまるわけではありません。
CSVからXMLへのコンバーターの使い方
ステップ1:CSVを貼り付けます
CSV を入力ボックスに貼り付けるか入力します。 excel または Google スプレッドシートから直接コピーされたブロックは、a の内容と同様に機能します .csv カンマまたは改行を含む引用フィールドを含むファイル。
ステップ2:オプションを設定します
区切り文字は自動検出に残すか、明示的に選択し、最初の行がヘッダーであるかどうかを確認し、ルートと行の要素名を設定し、各セルが子要素になるか属性になるかを選択し、XML 宣言を切り替えて、インデントされた出力と縮小された出力を切り替えることもできます。
ステップ 3: 変換する
「XML に変換」をクリックします。このツールはすべての行を解析し、列名を有効なタグにサニタイズし、マークアップ文字をエスケープして、整形式のドキュメントを組み立て、名前を変更した列やぼろぼろの行について警告します。
ステップ4:コピーまたはダウンロード
XML をクリップボードにコピーするか、としてダウンロードします .xml ファイル. shape がターゲットシステムにまったく合わない場合は、要素名を調整するか、要素と属性モードを切り替えて再度変換します。
区切り文字を自動検出する理由?
すべての " CSV" がカンマで区切られているわけではありません。ヨーロッパのロケールからのエクスポートでは、カンマがそれらの領域では小数点区切り文字であり、データベースやログから取得されたデータはタブ区切りになっていることが多いため、セミコロンが頻繁に使用されます。カンマにロックされたコンバーターは、セミコロン ファイルを単一の幅の広い列として読み取り、ナンセンスを生成します。このツールは、カンマ、セミコロン、タブ、パイプを試して、最初の数行にわたって一貫した列数を生成する方を選択することで区切り文字を検出します。これは、散文内のカンマが頻繁に、しかし不規則に表示されるため、生の周波数よりもはるかに信頼性の高い信号です。ファイルが異常な場合は常に推測をオーバーライドできますが、一般的なケースでは、検出は貼り付けて実行することを意味します。
行にヘッダーよりも多くのフィールドまたは少ないフィールドがあるぼろぼろの行は、他の現実世界の混乱です。コンバーターは、短い行を空の要素でパッドし、データを静かにドロップするのではなく警告するため、行 47 が下流のフィールドを発見する代わりに最後の 2 つのフィールドが欠落していることがわかります。ヘッダーの向こう側の余分なフィールドは一般的な列名を取得するため、何も失われず、警告は影響を受けた行数を正確に知らせます。これは通常、問題をソースの迷走区切り文字に変換する前に乱雑なファイルを検査する場合、 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ヘッダー行はどうなりますか?
"first 行が header" がオンの場合、ヘッダー セルはすべてのデータ行の XML 要素名になります。名前は有効な XML タグにサニタイズされるため、"First Name" は First_Name になり、重複する列の名前は数字の接尾辞で変更されます。ヘッダー オプションをオフにすると、列の名前は column_1、column_2 になります。
各セルは要素であるべきですか、それとも属性であるべきですか?
XML を読み取るシステムによって異なります。 element モードは値ごとに 1 つのタグを持つ読み取り可能なネスト可能な構造を書き込み、attribute モードは列ごとに 1 つの属性を持つ単一のコンパクトな要素に行を折りたたみます。このコンバータは両方をサポートしているため、スキーマまたはインポート ターゲットが期待する 1 つを選択します。 elements は、不明な場合はより安全なデフォルトです。
コンバータは値内のカンマを処理しますか?
はい。 RFC 4180 に続いて、カンマ、二重引用符、または改行を含む値は、CSV で二重引用符で包まれ、埋め込まれた引用符は 2 つの引用符で書かれます。パーサーは、それらの引用符フィールドを分割するのではなく、単一の値として読み取るため、"Hopper、Grace" は 1 つの要素に留まります。
どの区切り文字がサポートされていますか?
カンマ、セミコロン、タブ、パイプ。ツールはデフォルトで、最初の数行にわたって一貫した数の列を生成するものを選択することで区切り文字を自動検出します。これにより、ヨーロッパのセミコロン ファイルとタブ区切りのエクスポートを正しく処理し、区切り文字を手動で選択することもできます。
XML で列名の一部が変更されるのはなぜですか?
XML要素名にはスペースやほとんどの句読点を含めることができず、数字やハイフンで始めることもできません コンバーターは不正な文字をアンダースコアに置き換え、数字で始まる名前を接頭辞として付けるため、出力は常に適切に形成されます 各セルの元のデータは変更されず、タグ名のみが変更されます。
私の CSV データはサーバーにアップロードされていますか?
いいえ 変換全体がJavaScriptを使用してブラウザで実行されます。貼り付けたものは送信、ログ記録、保存されず、ページが読み込まれるとツールはネットワーク接続なしで動作し続けるため、CSV内の名前、電子メール、その他のデータは非公開に保たれます。
XMLをCSVまたはJSONに戻すことができますか?
このツールはCSVをXMLに変換します 逆の方法でデータを再形成するには、XMLからJSONへのコンバーターを使用し、XMLではなくJSONがターゲットである場合にCSVからJSONへのコンバーターを使用します それらはすべて同じプライバシー保証でクライアント側で実行されます。



