本文へスキップ

XML整形ツール

XMLを要素ごとに改行してインデントしたり、1行に圧縮したりします。整形式(well-formed)でない文書は何行何列で止まったかを示し、コメント・CDATA・DOCTYPEはそのまま残します。

0文字 · 0行
方式

0文字 · 0行

入力した内容はこのブラウザの中だけで処理され、サーバーには送信されません。 仕組みを見る

1行のXMLを要素の入れ子に合わせて改行とインデントで整形

使い方

「方式」で「整形」を選ぶと、要素ごとに改行し、階層の深さに合わせてインデントします。インデントはその下のリストで「半角スペース2つ」「半角スペース4つ」「タブ」から選びます。「圧縮」を選ぶと、要素のあいだの改行とインデントを取り除いて1行につなげます。このときインデントのリストは表示されません。

1行につながった次の入力を半角スペース2つで整形すると、こうなります。

<order id="7"><item sku="A1" qty="2">Pen</item><item sku="B2" qty="1"/><note>  keep  spaces  </note></order>
<order id="7">
  <item sku="A1" qty="2">Pen</item>
  <item sku="B2" qty="1"/>
  <note>  keep  spaces  </note>
</order>

文字だけが入った要素(item、note)は1行に収め、中の文字は空白も含めてそのまま残します。結果の下の「行数」と「サイズ」は入力ではなく結果を測った値で、サイズはUTF-8のバイト数です。

そのまま残るものと、書き方が変わるもの

コメント(<!-- -->)、CDATAセクション(<![CDATA[ ]]>)、処理命令(<?name ?>)の中身は変えません。整形ではそれぞれを独立した行にインデントして置き、圧縮では前後の改行だけを取り除きます。先頭のXML宣言(<?xml version="1.0"?>)と <!DOCTYPE ...> 宣言は、内側の記述も含めて入力の文字のまま写します。

要素と属性は、ブラウザが文書をいったん読み込んでから書き出し直します。そのため、意味は同じでも書き方がひとつにそろえられます。

入力 結果
<b></b> <b/>
<c> </c>(空白だけの要素) そのまま
x='1' x="1"
&apos; '
&#xE9;、&#65; é、A
&amp;、&lt;、&gt; そのまま

気をつけたいのは2行目です。空白だけが入った要素は、整形でも圧縮でも空要素にはせず、空白をそのまま残します。xml:space="preserve" が付いていなくても同じです。空白そのものが値になっている文書(たとえば区切り文字として半角スペース1つを入れた要素)でも、その値は変わりません。

DOCTYPEの中で自分で定義した実体も、展開されて出てきます。<!ENTITY co "ACME"> を定義して本文に &co; と書くと、結果の本文には ACME と書かれ、DOCTYPEの定義はそのまま残ります。

文字と要素が混ざった内容は、整形と圧縮で扱いが違います

<p>Hello <b>big</b> world <i>x</i></p> のように、ひとつの要素の中に文字と子要素が一緒に入っている場合の話です。XMLではこれを混合内容(mixed content)と呼びます。整形は、文字のかたまりも要素と同じように1行ずつに分け、前後の空白を切り落とします。

<p>
  Hello
  <b>big</b>
  world
  <i>x</i>
</p>

読みやすくはなりますが、Hello と <b> のあいだにあった空白1つが、改行とインデントに置き換わっています。文章の本文のように空白がそのまま画面に現れるXML(XHTML、DocBookなど)では、整形結果を元のファイルの代わりに保存せず、読むためだけに使ってください。

圧縮は逆に、こうした要素には手を付けません。文字が混ざった要素の中では空白も改行も元のままにするので、上の入力は圧縮しても変わりませんし、複数行にまたがっていれば改行も残ります。圧縮が取り除くのは、要素だけが並んでいる場所のインデントです。

チェックするのは文法までです

このツールが確かめるのは、文書が「整形式(well-formed)」のXMLかどうかだけです。開始タグと終了タグが対応しているか、属性値が引用符で囲まれているか、いちばん外側の要素がひとつだけか、といったXMLそのものの文法です。DTDやXSDといったスキーマが決めた構造(どの要素がどの順で並ぶか、どの属性が必須か)に従っているかどうかは「妥当(valid)」な文書かどうかの問題で、このツールは確認しません。結果が出たというのは、文法が合っているという意味でしかありません。

文法エラーがあると、結果の代わりに「整形式(well-formed)のXMLではありません。1行20列付近を確認してください。」のような案内と、その行、^ の印が表示されます。次の表はChromeで確かめた例です。

入力 表示される位置 原因
<a><b>1</b><c>2</b></a> 1行20列 <c> を </b> で閉じている
<a>1</a><b>2</b> 1行9列 いちばん外側の要素が2つある
<a b="1" b="2"/> 1行15列 同じ属性が2回ある
<x:a><x:b/></x:a> 1行5列 接頭辞 x の名前空間宣言(xmlns:x)がない
半角スペース2つのあとの <?xml version="1.0"?> 1行8列 XML宣言の前に別の文字がある

最後のケースは、ファイルの中身をコピーしたときに先頭へ空行や空白が紛れ込むと起こります。宣言は文書の1文字目から始まっていなければなりません。

外部実体のある文書

DOCTYPEが外部ファイルを指す実体を定義していると、その実体を参照している箇所が結果では空になることがあります。

Chromeで <!DOCTYPE a [<!ENTITY e SYSTEM "http://example.invalid/e.txt">]><a>&e;</a> を整形すると、DOCTYPEはそのまま残り、本文は <a/> になります。外部実体を参照していた箇所がエラーもなく空になるので、こうした文書の整形結果を元のファイルの代わりに保存すると、参照が失われます。DOCTYPEに外部実体の宣言があるときは、結果の下にこの点を知らせる警告が出ます。

参考資料

よくある質問

HTMLを貼り付けるとエラーになります。なぜですか?

HTMLでは問題のない書き方が、XMLでは文法エラーになるからです。<br> のように閉じていないタグ、&nbsp; のようにXMLで定義されていない実体、引用符のない属性値(x=1)が代表例です。XMLとして読ませるには <br/>、&#160;、x="1" に書き換える必要があります。本文にそのまま書いた & も同じ理由でエラーになるので、&amp; と書いてください。

エラーと表示された行には、間違いが見当たりません。どこを見ればいいですか?

表示される位置はブラウザが問題に気づいた場所で、原因はそれより前にあることがあります。たとえば3行目で <c> を閉じ忘れると、Chromeはその要素を囲む </a> が出てくる4行目を指します。表示された行で閉じているタグの相手を、上へさかのぼって探してみてください。知らせるのは最初に見つかったエラー1つだけです。ブラウザが位置を返さない場合は、行と列のない案内だけが出ます。

XML宣言に encoding="ISO-8859-1" のような、UTF-8以外のエンコーディングが書かれている場合はどうなりますか?

宣言は書かれたとおりに結果の先頭へ残ります。ただし、ダウンロードで保存されるファイルは宣言に関係なくUTF-8です。そのまま使うと宣言と実際のエンコーディングが食い違うので、宣言のencodingの値をUTF-8に直すか、ファイルを元のエンコーディングで保存し直してください。このような宣言があるときは、結果の下にも同じ内容の警告が出ます。結果をコピーして元のファイルに貼り付ける場合は、エディターが保存するときのエンコーディングに従います。

最終更新日: