メインコンテンツへスキップ

← ブログ一覧へ

XML とは?構造・well-formed と valid の違い・XML と JSON の使い分け

XML(拡張可能マークアップ言語)は JSON より古く、API の世界では JSON が主流になりましたが、決して廃れてはいません:SVG、RSS/Atom、Office 文書(.docx)、Android のレイアウト、Maven の pom.xml、SOAP はすべて XML です。読んで整える技術は今も役立ちます。

フォーマッターは意味に手を出してはいけません。 <feed><item id="1"><title>Hello</title></item><item id="2"><title/></item></feed> を XML フォーマッターに通しました。

<feed>
  <item id="1">
    <title>Hello</title>
  </item>
  <item id="2">
    <title/>
  </item>
</feed>

自己終了タグの <title/> は <title></title> に展開されず、そのまま残り、id 属性にも手が入っていません。この区別には意味があります。XML の規約では両者は等価ですが、素朴な文字列比較をする受け手はそう思わないかもしれません。つまり「ついでに整えてくれる」フォーマッターは、あなたのデータを変えているのです。ここで変わったのはインデントだけです。

XML の構造

XML はタグで包まれた入れ子の要素でデータを表し、要素は属性を持てます:

<book id="42" lang="ja">
  <title>ホビット</title>
  <author>トールキン</author>
</book>

すべての開きタグには対応する閉じタグ(または自己終了 <br/>)が必要で、タグは正しく入れ子にし、属性値は引用符で囲みます。どれか一つでも誤ると文書は解析できません。

構造は「戻したとき」に最も見やすくなります。以下は 1 行の XML で、item が 2 つ、うち 1 つはタイトルが空です:

<feed><item id="1"><title>Hello</title></item><item id="2"><title/></item></feed>

そして私たちの XML フォーマッターが返したのがこれです:

<feed>
  <item id="1">
    <title>Hello</title>
  </item>
  <item id="2">
    <title/>
  </item>
</feed>

追加も削除もありません。空白だけです。<title/> が <title></title> に展開されず自己終了のままである点に注目してください。XML では両者は等価であり、「親切に」一方を他方へ書き換えるフォーマッターは、署名や diff が依拠しているバイトを変えてしまいます。

well-formed と valid ——重要な違い

似ていますが別物です:

  • **整形式(well-formed)**は、上記の構文規則に従っていること——タグ・入れ子・引用符が正しいこと。どの XML パーサーでも確認できます。
  • 妥当(valid)は、さらに特定のスキーマ(DTD や XSD)に一致すること。どの要素・属性が許されるかを定義するもので、確認にはスキーマが要ります。

多くのオンラインツール——当ツールも含め——は XML が「整形式」かを確認します。これで日常のエラー(閉じ忘れタグ、余分な &)を捕らえられ、それが実際に解析を壊す原因です。

XML と JSON:どちらを使うか

  • JSON は軽量で、Web API やプログラムが読む設定の既定です。
  • XML は、属性・混在内容(テキストと要素の共存)・名前空間・コメントが必要な場合や、あるエコシステムが既に標準化している場合(SVG・RSS・Office 形式)に向きます。

競合というより、目的の違うツールです。

XML・JSON・HTML の比較

観点XMLJSONHTML
目的データの保存/転送データの保存/転送文書の表示
タグ自由に命名タグなし(波かっこ)固定セット(<p>・<div>)
属性ありなし(キーのみ)あり
厳密さ整形式が必須厳密寛容、ブラウザが誤りを許容
コメント<!-- -->なし<!-- -->

XML と HTML が似ているのは、どちらも SGML を祖先に持つからです。ただし XML は独自のタグを作れて構文が厳格、HTML は語彙が固定でブラウザが雑なマークアップを許します。XHTML は HTML に XML の規則を守らせようとした試みでした。

実例:RSS

RSS フィードは、取り決めたタグ名を使った XML にすぎません:

<rss version="2.0">
  <channel>
    <title>私のブログ</title>
    <item>
      <title>最初の投稿</title>
      <link>https://example.com/first</link>
    </item>
  </channel>
</rss>

SVG 画像も同じ仕組みで、<svg> 文書はテキストエディタで開いて手で編集できる XML です。

よくある落とし穴

  • 特殊文字はエスケープを。 テキスト内で実体参照が必要な文字は 5 つ:&lt;(<)、&gt;(>)、&amp;(&)、&quot;(")、&apos;(')。エスケープしない & は、フィードが壊れる最も多い原因です。
  • XML は大文字小文字を区別する。 <Title> と <title> は別要素で、閉じタグは完全に一致させます。
  • ルート要素は 1 つだけ。 整形式の文書は、最上位に全体を包む要素がちょうど 1 つだけあります。

SVG は XML なので、ベクター画像を手で編集するときも同じ整え方が使えます——PNG から SVG の解説もどうぞ。

あの字下げには、よくある誤解も潜んでいます。XML のデータモデルでは要素間の空白もテキストなので、「子要素だけ」と思っている場所でパーサーがテキストノードを報告し得ます。<feed><item id="1"><title>Hello</title></item><item id="2"><title/></item></feed> を上の字下げ版に整形しても文書の意味は変わりませんが、firstChild が返すものは変わります。だから XML のライブラリには「無視できる空白」という専用設定があり、JSON には対応する問題が存在しません。

ブラウザ内で整形・検証

XML 整形ツールは乱れた XML を読みやすいインデント構造に整形し、1 行に圧縮し直し、構文エラーを示します——すべて端末上なので、機微な設定ファイルも外に出ません。

関連ツール