XML フォーマットツール
XMLフォーマットとは?
XML フォーマッターは、圧縮された XML や読みにくい XML をインデント付きの読みやすい構造に整えるツールです。XML は設定ファイル、SOAP メッセージ、サイトマップ、RSS フィード、Office 文書、ビルド成果物、古い業務連携などで使われ、閉じタグの欠落やエスケープミスだけでも処理が止まることがあります。このツールは、入れ子要素、属性、テキストノード、名前空間、エラーのありそうな箇所を見つけやすくします。デバッグ、文書化、比較、学習に役立ちますが、特定の XSD、API 契約、取引先フォーマットに従う必要がある場合は、別途スキーマ検証が必要です。
使い方
使い方
- 左の入力ボックスにXMLデータを貼り付けるか入力します
- インデントサイズを選択します(2スペース、4スペース、またはタブ)
- 「フォーマット」をクリックして整形するか、「圧縮」をクリックして空白を削除します
- 結果は右側にシンタックスハイライト付きで表示されます
- 「コピー」または「ダウンロード」をクリックして結果を保存します
XMLに関する注意
- フォーマットは空白を変更し、ドキュメントの意味は変更しませんが、空白はテキストノードや混合コンテンツドキュメント内では重要になる可能性があります。
- 解析に失敗した場合は、閉じられていないタグ、ネストの不整合、重複する属性、アンパサンドなどのエスケープされていない文字を確認してください。
利用シーン
`のようなSGML由来の自己閉じ省略記法(XML 1.0 §3.1で許容)はそのまま保持されるため、XHTMLやRSS内のHTMLボイド要素はスラッシュを維持する必要があります。`
`のようにペアにすると、HTML5パーサーでは描画結果が変わります。CDATAセクションはリテラルの`]]>`終端ルールも含めてそのまま保持され、`&`へのエスケープには変換されません。
仕組み
XMLフォーマットはW3C XML 1.0(第5版)勧告に基づいています。パースは`new DOMParser().parseFromString(src, 'application/xml')`(または`text/xml`)で行われ、仕様で定義された7つの生成物(Element、Attr、Text、CDATASection、Comment、ProcessingInstruction、DocumentType)に一致するノードを持つDocumentを返します。HTMLと異なり、XMLパーサーは厳密です。タグの不一致、エスケープされていない`&`、重複属性があるとパースが中断され、DOMParserは行番号と列番号を含む`<parsererror>`要素を返します。サーバーサイドの同等機能にはlibxml2(`xmllint --format`)、Pythonの`xml.etree.ElementTree`、JavaのStAX/SAX、.NETの`XmlReader`があります。 プリンターはDOMをノードごとにシリアライズします。各Elementはdepth*indentスペースで独自の行に開かれ、子要素はdepth+1で再帰処理され、閉じタグは開きタグと整列し、空要素は`<foo/>`の自己閉じ省略記法に折りたたまれます(仕様§3.1で`<foo></foo>`と意味的に同等と宣言)。5つの定義済みエンティティ(`&`、`<`、`>`、`"`、`'`)はテキストと属性値で常に再エンコードされます。CDATAセクション(`<![CDATA[ ... ]]>`)はそのまま保持されます。これはエンティティエンコードが必要なコンテンツの明示的なエスケープハッチであり、仕様§2.7でCDATAブロック内に終端子`]]>`を含むことは禁止されています。`<?xml-stylesheet?>`のような処理命令やXML宣言`<?xml version="1.0" encoding="UTF-8"?>`はドキュメントプロログに保持されます。DOCTYPE宣言は単一の文字列としてラウンドトリップされます。 フォーマッターの複雑性の大部分は2つの微妙な点に起因します。第一に、テキストと子要素の両方を含む混合コンテンツ(`<p>Hello <b>world</b>!</p>`など)は、ドキュメントのインフォセットを変えずに再インデントできません。このようなコンテキストではすべての空白文字が重要なTextノードとなるため、フォーマッターは混合コンテンツを検出するためにElementに非空白Text子があるかスキャンし、そのサブツリーには単一行シリアライズに切り替えます。第二に、名前空間宣言(`xmlns`、`xmlns:prefix`)は最初に宣言された要素に留まる必要があります。移動するとスコープが変わります。属性順序は仕様上正規化されていないため、ほとんどのフォーマッターは先頭の`xmlns:*`宣言を保持しつつアルファベット順ソートを適用します。パースとシリアライズはドキュメント長に対してO(n)です。非常に大きなフィードは通常、メモリ内にDOMを構築する代わりにSAXでストリーミング処理されます。
- 仕様:W3C XML 1.0 第5版(REC-xml-20081126)。DOMは`DOMParser().parseFromString(src, 'application/xml')`で構築され、サーバーサイドではlibxml2や`xmllint --format`と同等です。
- 設計上厳密です。タグの不一致、エスケープされていない`&`/`<`、重複属性、無効な文字は`<parsererror>`要素を生成します。HTMLの寛容なリカバリは適用されません。
- テキストと属性値で5つの定義済みエンティティを再エンコード:`&` `<` `>` `"` `'`。` `のような数値文字参照はそのまま保持されます。
- 自己閉じ`<foo/>`と`<foo></foo>`は§3.1で意味的に同一です。CDATAセクションはそのまま保持され、終端子`]]>`を含むことはできません。
- 混合コンテンツ(テキスト + 子要素)はインフォセットを変更せずに再インデントできません。プリンターは重要な空白を検出し、それらのサブツリーをインラインでシリアライズします。
- 名前空間宣言(`xmlns`、`xmlns:prefix`)は最初の宣言の要素に留まります。移動するとスコープが変わります。属性順序は正規化されていないため、安定ソート(xmlns先頭、その後アルファベット順)が一般的です。
- 複雑性:DOMベースのツールではパースO(n)、シリアライズO(n)。大きなドキュメントはSAX/StAX(Pythonのxml.sax、Javaのjavax.xml.stream)でストリーミングし、フルツリーをメモリに読み込まないようにします。
使用例
基本要素
<!-- 入力 (1 行) -->
<book><title>XML Guide</title><author>Jane Doe</author><year>2024</year></book>
<!-- 出力 (2 スペース) -->
<book>
<title>XML Guide</title>
<author>Jane Doe</author>
<year>2024</year>
</book>属性付き
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<book id="b001" lang="en" available="true">
<title>Effective XML</title>
<price currency="USD">29.99</price>
</book>
</catalog>名前空間と CDATA を含むネスト構造
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns:GetUser xmlns:ns="https://example.com/api">
<ns:UserId>10086</ns:UserId>
<ns:Script>
<![CDATA[ if (a < b && b > 0) { return true; } ]]>
</ns:Script>
</ns:GetUser>
</soap:Body>
</soap:Envelope>よくある質問
このツールは何をしますか?
ネストされた要素をインデントし、各要素を独立した行に配置し、終了タグを揃えることで XML を整形します。SOAP レスポンス、RSS フィード、設定ファイルなど、1行にまとまって届いた XML ペイロードを確認するのに便利です。
スキーマに対する検証は行われますか?
いいえ。ペーストされた整形式 XML をフォーマットするだけです。スキーマ(XSD、DTD、RELAX NG)の検証には別のツールが必要です。整形式エラー(タグの不一致、閉じカッコの欠落など)は報告されますが、本ページで修正することはできません。
属性の順序は保持されますか?
はい。XML の属性順序は仕様上は意味を持ちませんが、フォーマッターは予期せぬ変更を避けるため元の順序を維持します。CDATA セクション、コメント、処理命令も保持されます。
空白はどう扱われますか?
要素間の空白は正規化されます(インデント付きで1要素1行)。テキストコンテンツ内の空白はデフォルトで保持されます(要素の内容は意味を持ちます)。xml:space='preserve' 属性が存在する場合は尊重されます。
XML を圧縮(minify)できますか?
ビルドによっては、要素間の空白を取り除く minify モードがあります。ただし、意味を持つ空白(テキストコンテンツや xml:space='preserve' 領域)は保持される必要があるため、注意が必要です。リッチなテキストコンテンツがある場合はラウンドトリップをテストしてください。
XML はアップロードされますか?
いいえ。パースと整形はブラウザ内蔵の DOMParser と XMLSerializer を使ってブラウザ内で実行されます。何も送信されません。
XML 名前空間はどう扱われますか?
名前空間宣言(xmlns)と接頭辞付きの要素・属性は、書かれた通りにフォーマットされます。ネストされた要素で同じ名前空間を再宣言している場合も保持されます(一部のバリデーターはこれを気にしますが、しないものもあります)。