XML を NDJSON に変換

ここで XML を NDJSON に変換できます。無料、アカウント不要です。ファイルを上の枠に落とせば、数秒で結果がダウンロードできる状態になります。 変換はお使いのブラウザーの中で行われるので、ファイルはアップロードされません。Windows でも macOS でも Linux でも、iPhone でも Android でも同じように動き、通信を切っても動き続けます。

  • 処理される場所 ブラウザーの中です。ファイルがアップロードされることはありません。
  • 作り直し NDJSONはXMLとは仕組みが違います。非可逆コーデックのような段階的な劣化ではありません。NDJSONが表現できるものは忠実に再現され、対応するものがないものはまったく残りません。
  • ファイルサイズの上限 1ファイルあたり100MBまで。無料、アカウント不要です。
  • 知っておきたいこと XML の属性もテキストノードも、どちらもキーになります。これはコンバーターがあなたの代わりに下す判断です。

一度に100ファイルまで。フォーマットが混ざっていても構いません。

XML 文書がなぜ必ず 1 行になるか

改行区切りの JSON は分割の手がかりとして、解析されたデータのいちばん外側にあるリストを使います。XML を解析した結果は常にルート要素名をキーとする 1 個のオブジェクトになり、そこにリストは現れません。入力が 1 個の値なら、出力は 1 行です。

これはファイルがどれだけ大きくても、繰り返し要素をいくつ含んでいても変わりません。1 万件のレコードを持つ 40 MB の書き出しは、40 MB の 1 行に変換されます。何も失われず、何も分割されません。もし欲しかったのが 1 万行だったなら、この変換だけではそれを得られていません。

XML の書き出しから 1 レコード 1 行を得るには

うまくいく道筋は 2 段階です。まずファイルを JSON に変換し、次に jq に通します。繰り返し要素のあるパスを選び、それを反復し、コンパクト出力フラグを使って各オブジェクトを 1 行にします。1 個のコマンドで済み、スクリプトの中で繰り返し使え、何をレコードと見なすかという判断をあなた自身の手に残せます。

この判断は文書だけから機械的には決められません。RSS フィードならレコードは item 要素、SOAP のレスポンスなら本体の 3 階層下にあるかもしれず、銀行の書き出しならベンダーが取引と呼ぶことにした何かです。推測するツールは、たいていは正しくても、たまに間違えて読み込みを壊すという結果になります。

1 ファイル 1 行がちょうど正しい場合

これはまったく使い道のない組み合わせではありません。入力が 1 個の大きな文書ではなく、たくさんの小さな XML 文書——請求書のフォルダー、マニフェストの束、イベントごとのペイロードの一群——であれば、1 ファイル 1 行がまさにローダーが求める形で、出力をつなげれば元の文書ごとに 1 レコードを持つ正しい NDJSON になります。

棚卸し用途にも向いています。リポジトリ内の設定ファイルをそれぞれ変換して連結すれば、何が書かれているかを問い合わせできるデータセットになり、これは他の方法ではなかなか得にくいものです。どちらの場合も、1 行という結果はこの変換が正しく仕事をしている証拠です。

レコードを分けたあとも付いてくる形の問題

レコードを分割したあとも、XML 由来の性質が 1 つ残ります。繰り返し要素は複数回現れたときだけ配列になります。タグ要素を 1 個だけ含むレコードは文字列に、2 個含むレコードはリストになります。同じ書き出しの中でも、行によって配列だったりそうでなかったりします。

スキーマオンリードの仕組みは最初に見たレコードから型を推定し、それ以降を拒否するか強制的に変換します。直す場所はローダーではなく jq の段階で、繰り返しうるすべてのフィールドを、書き出す各行で配列に正規化しておけば、下流の何かが見る前にストリームを均一にできます。

その 1 行に実際に入っているもの

インデントなしのコンパクトな JSON で、キーは文書の順序どおり、末尾に改行が付きます。属性は @ を接頭辞に持つキーとして現れ、属性を持つタグの要素テキストは #text というキーの下に入ります。名前空間の接頭辞はキー名の中にそのまま残るため、soap:Body はコロンを含むキーになり、XML 宣言のある文書は ?xml という名前のトップレベルのキーを 1 個余分に持ちます。

この 2 つは読み込みの前に取り除く価値があります。コロンや疑問符を含むフィールド名は多くのクエリエンジンやテーブルスキーマで扱いづらいか無効であり、宣言はファイルについてのメタデータであってファイルの中のデータではありません。

XML パーサーが返すそのままの型

数値に見える値は属性でも要素テキストでも解析されます。件数には便利ですが識別子には破壊的です。007 と書かれた注文番号は数値の 7 になり、1.0 と書かれたバージョン属性は 1 になります。データストアに入れると、これらは数値列になりパディングは全行から消えます。

一方で、恐れているほど悪くない挙動が 1 つあります。JavaScript の数値として表現できないほど長い整数は、丸められるのではなく文字列のまま残るので、19 桁の参照番号はそのまま保たれます。指数表記はこの保護を受けません。1e3 と書かれた値は 1000 になります。どちらの場合もエラーは出ません。あとで結合に使う参照番号があるなら、最初の読み込みより前、jq の段階で文字列に戻しておいてください。

結果の読み込みと、誰も想定しない行の長さ

NDJSON は jq でそのまま読め、pandas は lines オプションで読め、主要な倉庫ローダーの読み込み形式としても使われます。Elasticsearch の一括投入は各文書の前にアクション行が必要で、これはレコードを分割するのと同じ jq の工程で加えられます。

この組み合わせに特有の注意点は行の長さです。1 行ずつ処理するリーダーは、その行全体をメモリーに保持しなければなりません。文書丸ごとの 1 行は文書丸ごとのバッファーを意味し、読み込み先の 1 レコードあたりのサイズ制限は、レコードではなくファイル全体に対して効いてしまいます。これが、読み込む前にレコードを分割しておくべき実務上の理由です。

ストリーミング型の XML パーサーのほうが正しい答えの場合

書き出しが大きく、定期的に行われ、毎回ストリームにする必要があるなら、正直な答えはブラウザー上の変換ツールではありません。ストリーミング型のパーサーは XML ファイルを木構造としてメモリーに構築せずに要素単位で読み進められ、そのループから 1 レコードにつき 1 個の JSON 行を出す処理は、どの言語でも短いプログラムで書けます。

この方式ならメモリーに収まらない大きさのファイルにも対応できますが、ここでの解析は書き出す前に文書全体を JavaScript のオブジェクトとして構築するため、そこまでは対応しません。単発のファイルや上記の「1 ファイル 1 行」の用途なら、この変換ツールのほうがプログラムを書くより速く済みます。繰り返し動かすパイプラインなら、そうではありません。

コメントと、行区切りファイルが持てないもの

XML のコメントは解析の段階で捨てられ、NDJSON にはそれを受け取るコメント構文がないため、書き出しの中にあった説明文はすべて消えます。ヘッダーもスキーマも前置きもなく、NDJSON ファイルの各行はレコードであり、ローダーはファイルの先頭にある何であってもレコードとして読もうとします。

データの由来を記録する必要があるなら、それはレコードの中のフィールドかファイル名に属するべき情報です。先頭行として書き加えると、そのファイルは目的にとって無効になり、ローダーはそれを、この文章よりずっとわかりにくい形で知らせてきます。

XML を NDJSON に変換する手順

  1. お手元の XML ファイル をこのページに落とすか、押してファイルを選んでください。
  2. 変換先に NDJSON を選びます。変換はブラウザーの中で行われ、ファイルはアップロードされません。
  3. できあがった NDJSON ファイル をダウンロードします。

XML と NDJSON——何が変わるか

XMLとNDJSONの比較
XMLNDJSON
正式名称Extensible Markup LanguageNewline-Delimited JSON
拡張子.xml.ndjson, .jsonl
メディアタイプapplication/xmlapplication/x-ndjson
最初の公開19982013
発行元W3C
仕様XML 1.0
ライセンスオープン標準オープン標準
現在の位置づけ現行現行
ブラウザで開けるかすべてのブラウザ対応なし
代わりに検討される形式JSON, YAMLJSON, CSV

失われるもの

コメントは引き継がれません。XML ではファイルに説明を書き添えられますが、NDJSON にはコメントの構文そのものがないので、説明の行はすべて落ちます。そして困るのは、まさにコメントが書かれるようなファイル——誰かが引き継ぐ設定ファイルです。

結果を開く

NDJSON を読めるブラウザーはありません。その点では、2 つのうち通用する場所が狭いのはこちらです。送る前に、受け取る側がこれを受け付けるかどうか確かめてください。

開くプログラムが重なりません。XML はVisual Studio CodeとoXygen XML Editorで、NDJSON はjqとpandasで開きます。結果を渡す相手には後者のどれかが要ります。

どちらの形式が何のためのものか

XML は W3C の形式です(1998 年に登場)。 XML 1.0 で規定されています。ファイルが、それを書いた道具より長く生きなければならないなら、この一点には値打ちがあります。

NDJSON は 2013 年から使われています。jqとpandasがこの形式を読めます。

XML は 1998 年、NDJSON は 2013 年に登場しました。人に渡すならたいてい古いほうが安全で、新しいほうは同じ仕事をより少ないバイト数で片づけます。

XML から NDJSON:よくある質問

XML ファイル はどこかにアップロードされますか。

いいえ。この変換は完全にブラウザーの中で行われるので、ファイルが端末から出ることはありません。ご自分で確かめられます。開発者ツールのネットワークタブを開いて、何か変換してみてください。ページそのものと、このサービスの費用をまかなっている分析・広告のリクエストは見えますが、あなたのファイルを運んでいるリクエストはひとつもありません。

XML から NDJSON への変換は無料ですか。

はい。アカウントも透かしもなく、消費される 1 日の割り当てもありません。お使いの機械の上で動くので、何度でも戻ってきていただけます。ブラウザーが扱えるのは 100 MB までのファイルで、一度に 100 本です。

XML を NDJSON に変換すると品質は落ちますか。

XML と NDJSON は、内容の表し方が根本から違います。ですからこの変換は複製ではなく再構築です。誠実ではありますが、1 バイトも同じというわけではありません。 XML の属性もテキストノードも、どちらもキーになります。これはコンバーターがあなたの代わりに下す判断です。

NDJSON ファイル はブラウザーで開けますか。

NDJSON を読めるブラウザーはありません。その点では、2 つのうち通用する場所が狭いのはこちらです。送る前に、受け取る側がこれを受け付けるかどうか確かめてください。

XML から NDJSON にすると、コメントは残りますか。

コメントは引き継がれません。XML ではファイルに説明を書き添えられますが、NDJSON にはコメントの構文そのものがないので、説明の行はすべて落ちます。そして困るのは、まさにコメントが書かれるようなファイル——誰かが引き継ぐ設定ファイルです。

これらのフォーマットについて