XMLフォーマッター & 構文検証ツール

ブラウザのDOMParserとXMLSerializerを利用し,実行ボタンのクリック操作によってXMLのインデント整形とwell-formedness確認を行うツールです.2・4・8スペースの整形や圧縮に対応し,タグ構造の確認を補助します.入力サイズやノード数の上限ガードを備え,解析されたDOMのテキストやCDATA,コメントを維持して出力します.

読み込み中...

このツールが向いている用途

操作欄に戻る ↑

XMLを整形して読みやすくするか,圧縮表示します.

まず試せること

<root><item>42</item></root> を入力し,整形後に要素が改行・インデントされ,値が42のままか確認します.

利用条件

構文エラーを解消してから再実行してください.意味のあるテキストの空白は保持します.

入力データの記述例

<user><id>1</id><name>Alice</name></user>

処理後の出力結果例

<user>
  <id>1</id>
  <name>Alice</name>
</user>

よく発生する構文エラー・記述ミス

  • •開始タグと終了タグの名前が一致していない(例:<name>値</username>).
  • •属性値がダブルクォーテーション(")またはシングルクォーテーション(')で囲まれていない.
  • •データ内に「&」や「<」などの文字がエスケープ(&amp; や &lt;)されずに記述されている.

対応規格・動作仕様

XML(DOMParserで解析できる整形式文書)XSD・DTDの妥当性検証やHTML5解析は行いません

関連する技術解説・ブログ記事

ZeroToolsのブラウザ内処理と,外部通信を利用する機能の違いやデータの取り扱いについて.

記事を読む

ZeroToolsのブラウザ内処理とプライバシー

ZeroToolsは,入力内容を端末内で処理するツールを中心に提供しています.各ツールの対応範囲と制限を確認して利用してください.

データの取り扱い・プライバシー方針
第1章

入力と構文エラー

本ツールは,入力されたXMLテキストをブラウザの標準APIである DOMParser(application/xml 指定)を用いて構文解析(well-formedness検証)します.パーサーを呼び出す前の事前検証として,入力サイズが上限である100,000 UTF-16コード単位(code units)を超えていないかのチェックが行われ,同時にDOCTYPE宣言(<!DOCTYPE ...>)の存在が検知された場合は解析前に即座に処理が拒否されます.

構文解析時に入力データが整形式(well-formed)を満たさない場合,Mozilla系の予約されたエラー名前空間だけでなく,WebKit等では部分解析ドキュメント内にXHTMLのparsererrorパネルが挿入される挙動が確認されています.そのため共有コアでは,単にparsererrorというタグ名だけで判定するのではなく,Mozillaのエラー名前空間と,既知のWebKit/Blink系XHTML生成エラーパネル(名前空間,スタイル指標,2つのエラー見出しを含む構成)の両方を厳格に検出して拒否します.

名前空間のみですべてのブラウザを網羅できるとは想定せず,既知の生成パネル判定も保守的であるため,類似構造や全環境での検知は保証されません.なお,名前空間のない通常要素や,生成パネル指標を持たない通常のXHTML parsererror要素は有効なデータとして受容されます.

解析失敗時は生のエラーHTMLや行番号を露出させず,部分的な出力も行わずに局所化された汎用エラーを提示します.

構文エラーが検出された場合,UIにはブラウザ固有の実装差がある行番号や列番号の生情報ではなく,統一された汎用エラーメッセージが明瞭に表示されます.また,ネイティブDOM解析が成功した後にも厳格なリソース上限ガードが適用され,XML階層の最大深さ(depth)64,ルート要素が単一(root 1つ)であること,属性ノードを含めてカウントした総ノード数が20,000ノード以下であること,さらにシリアライズ後の出力が2,000,000 UTF-16コード単位以内であることが順次検証されます.

これらの上限を超過した場合は安全のため処理が中断されます.本ツールはWebWorkerを用いずにメインスレッド上で動作するため,極端な高負荷入力に対する処理時間やブラウザの完全なフリーズ回避を保証するものではありません.エラー発生時は不正な出力結果が画面に残らないよう即時に非表示化されます.

第2章

2・4・8スペース

構文解析と各種ガードチェックを通過したXMLドキュメントは,要素の階層構造に基づいて視覚的なインデントが付与されます.インデント幅はUI上のセレクトボックスから「2スペース」「4スペース」「8スペース」の3種類を選択して指定することが可能です.タブ文字によるインデント挿入には対応しておらず,半角スペースによるインデント処理に統一されています.

本ツールのインデントアルゴリズムにおける極めて重要な特徴は,既存のテキストノードに対する保護方針です.ある要素が直接の子ノードとして空白文字のみで構成されるテキストノードやCDATAセクションを含む場合であっても,直接のTextノードまたはCDATAが1つでも存在する要素については,その内部に対するスペースの挿入や既存空白の再インデント,置換,フィルタリングを一切行いません.

そのような要素は XMLSerializer を用いて要素全体がそのままシリアライズされます.既存の空白や改行を安全に保つための設計であり,勝手な空白整形によるテキストデータの破損を防止します.

新たなインデント(2・4・8スペース)と改行文字が付与される対象は,子ノードにTextノードやCDATAセクションが一切存在しない「純粋な要素のみを含む分岐(text-free branches)」に限定されます.DOMツリーの再帰的走査において,テキストを含まない親要素の配下にある子要素群に対してのみ,深さに応じたスペース文字列が行頭に計算されて付与されます.

これにより,構造的なタグの階層関係のみを綺麗に整列させつつ,テキスト内容に含まれる重要な空白情報を完全にそのまま温存することが可能となっています.

第3章

XMLSerializerとescape

DOMツリーの各ノードをXML文字列へと再構築するシリアライズ処理には,ブラウザ標準の XMLSerializer が利用されます.このAPIを経由することにより,DOMツリー内の要素構造,属性値,コメントノード(<!-- -->),処理命令(Processing Instructions: <?...?>),および CDATA セクションがブラウザの標準仕様に準拠した形式で忠実に保持され,適切に出力文字列へと書き戻されます.

属性値やテキストノードに含まれる特殊記号(<,>,&,",' など)は,XMLSerializer のシリアライズ仕様に基づいて標準的なエンティティ参照(&lt;,&amp; など)へとエスケープされます.ただし,元のXMLソースに記述されていた引用符の種類(シングルクォートかダブルクォートか)の完全な一致や,数値文字参照・エンティティ参照の記述形態,元のバイト列との完全一致は保証されません.

また,本ツールの出力生成においては,不自然なエスケープの混入を防ぐため,引用符の直前に不要なバックスラッシュを挿入するような特殊な加工は一切排除されています.

なお,DOCTYPE宣言については前述のとおり入力段階で拒否されるため,シリアライズ対象として出力に現れることはありません.本ツールはブラウザ標準の DOMParser および XMLSerializer を用いてDOMツリーを構築・再出力する仕組みを採用しています.

構文解析時に改行コードの正規化や属性値空白の処理が行われ,シリアライズ時にもタグの記述形式や属性順序などがブラウザ仕様に準じた形へ再構成されるため,入力元の字句表現やバイト列と完全一致する出力が得られるわけではありませんが,定義された構文木に基づいた明確な変換スコープで処理されます.

第4章

mixed contentの具体例

XMLの取り扱いにおいて特に繊細な配慮が求められるのが,同一の親要素内にテキストノードと子要素ノードが混在する「mixed content(混合内容)」や,直接テキストを含む要素の扱いです.たとえばHTML/XHTMLの <p> タグ内にプレーンテキストと <strong> などのインライン要素が同居しているケースや,コード片などを保持する要素がこれに該当します.

本ツールのフォーマッター実装では,対象要素の直接の子ノードを走査し,空白文字のみのノードを含めて何らかの直接のTextノードが存在するか,あるいはCDATAセクションが含まれているかを厳格に検査します.これらが1つでも検出された場合,その要素全体は内部インデントの追加対象から完全に除外され,XMLSerializer によって内部の空白・改行・文字の並びが一切変更されることなくそのままシリアライズされます.

余分な空白や改行を挿入してしまうと,文書の表示結果やパース後の文字列値が変化してしまうリスクがあるためです.

既存の空白テキストノードを間引いたり,内部の改行位置を揃え直すような再インデント処理は行われません.要素にxml:space="preserve"が指定されている場合だけでなく,タグ間に改行やインデントとしてのみ存在する空白テキストノードが含まれている場合であっても,要素が直接のテキストノードやCDATAを持つ階層ではインデント付与処理自体がバイパスされます.

インデントの追加処理は,直接のテキストを一切含まない要素に対してのみ適用されます.これにより解析後のDOMデータとしてのテキスト内容は保持されますが,入力元と同一の生バイト列や字句表現をそのまま復元することを保証するものではありません.

第5章

圧縮が変更する空白

本ツールには,インデントを付加して構造を読みやすくする整形機能に加えて,データサイズを削減するための「圧縮(Minify)」機能も備わっています.UI上で圧縮を指定した場合,各要素間に新たなインデント用スペースや改行文字を一切付加することなく,要素ノードが連続して出力されるコンパクトなXML文字列が生成されます.

この圧縮処理において最も留意すべき点は,要素内の既存テキストに含まれる空白文字(インデントや改行文字を含む)は決して削除されないという点です.ルート要素の外側に存在するドキュメントレベルのセパレータ(余分な空行など)は除去される場合がありますが,圧縮によって要素間の空白テキストが網羅的に圧縮・除去されると主張するものではありません.

前述のとおり,直接テキストノードが存在する要素内部の空白は手つかずのまま維持されます.

また,コメントノード,CDATAセクション,処理命令(PI)についても圧縮処理によって勝手に間引かれたり破棄されたりすることはなく,そのまま出力内に保持されます.極限まで無条件にバイト数を削るような非可逆の圧縮ではなく,XMLとしての文法構造と文書内に含まれる既存のテキスト空白の完全性を損なわない範囲でのコンパクト化を実現しています.

第6章

スキーマ・署名・保存の確認

本ツールの整形結果や圧縮結果をシステムや連携処理で扱う際は,ツールが前提とする変換仕様と技術的制約を把握しておく必要があります.第一に,XMLデジタル署名(XML Signature)が付与されたドキュメントについてです.署名の検証結果は署名対象範囲(SignedInfoや参照要素)の指定方法および正規化アルゴリズム(Canonical XML規則など)の適用状況に依存します.

本ツールではテキストを持たない要素階層へのインデント追加や,XMLSerializerによる改行コードの正規化,属性の出力順序,空要素タグの表記変更などが発生するため,これらのシリアライズ結果が署名対象の生バイト列や正規化結果に影響を与える場合があります.署名検証が完了していない原本データには適用せず,必ず元の署名付きデータを保管した状態で使用してください.

第二に,スキーマ検証と宣言の取り扱いです.本ツールはDOMParserによる整形式(well-formedness)の確認のみを実行し,外部DTDやXSD(XMLスキーマ),XPath式やXSLT変換を用いた構文・妥当性検証には対応していません.入力データの先頭に存在するXML宣言(<?xml version="1.0" ...?> など)は正規表現を用いて抽出され,整形後の出力先頭に文字列として保持されます.

ただし,この処理は宣言文字列の抽出に留まり,XML宣言内の encoding 属性(Shift_JISやEUC-JPなど)に応じた実際の文字エンコーディングのバイト変換処理は行われません.JavaScriptの実行環境上では常にUTF-16文字列としてメモリ内で処理され,クリップボードへのコピーやファイル保存時の文字コードは利用者の実行環境に依存するため,文字コード変換を前提としたパイプラインでは事前の変換確認が必要です.

第三に,クリップボードへのコピー操作についてです.フォーマット結果のコピー処理は非同期の Clipboard API(navigator.clipboard.writeText)の完了を待機(await)して実行され,書き込みが失敗した場合にはUI上でエラーが明瞭に通知されます.

構文エラーやサイズ超過などの検証エラーが発生した状態では,不正な結果がクリップボードに送られたり画面に表示されたりすることはありません.

最後に,処理性能と安全性の境界についてです.本ツールは入力時点で100,000 UTF-16コード単位,DOM解析後に最大深さ64,最大20,000ノード,出力2,000,000 UTF-16コード単位という厳格なガードを設けていますが,WebWorkerを用いないブラウザのメインスレッド実行であるため,極端に複雑なデータにおけるメモリ消費やブラウザの一時的な応答遅延を完全に皆無にできる保証はありません.

仕様上の制限を十分にご理解の上,安全にご利用ください.

よくある質問(FAQ)

A.
外部DTDやXSDスキーマを用いた妥当性(Validation)の検証には対応していません.本ツールが行うのはブラウザのDOMParserによる整形式(well-formedness)の構文検証のみです.また,セキュリティおよび仕様上の理由により,DOCTYPE宣言(<!DOCTYPE ...>)を含む入力は解析前に即座に拒否されます.
A.
XML宣言(<?xml ...?>)に記述された encoding 指定に基づいた文字エンコーディングのバイト変換は行われません.元のXML宣言は正規表現によって抽出されて出力の先頭にそのまま保持されますが,データ自体はJavaScript内部のUTF-16文字列として扱われるため,実際の保存文字コードはお使いのエディタ環境に依存します.
A.
XMLデジタル署名の検証成否は,署名対象として指定されたノード範囲や適用される正規化(Canonicalization)ルールに依存します.本ツールは直接のテキストを含まない階層にインデントを追加し,XMLSerializerによる改行コードの正規化や属性順序・空要素タグ表記の再出力を行うため,シリアライズ結果の変更が署名検証時の入力データに影響を与える場合があります.検証を終えていない原本データには直接適用せず,必ず署名付き原本を別名で保持した状態で確認を行ってください.
A.
CDATAセクション,コメント(<!-- -->),処理命令(<?...?>),およびDOMに読み込まれたテキストノードの空白文字は,整形や圧縮の処理によって勝手に削除されたり再インデントされたりすることはありません.直接テキストやCDATAを含む要素階層はインデント処理をバイパスし解析されたDOMデータとして保持されますが,DOMParserによる改行正規化やXMLSerializerによる字句表現の再出力が行われるため,入力元の完全な字句表現や生バイト列の一致を保証するものではありません.