これだけ守れば安心!XMLの書き方と基本ルールをやさしく解説

Web

「XMLファイルを自分で書かないといけなくなったけど、何に気をつければいいの?」
「タグの閉じ忘れでエラーが出るって聞いたけど、具体的にどう書けばいいの?」

そんな疑問を持つ方のために、この記事ではXMLの書き方と守るべき基本ルールを、初心者にもわかるように丁寧に解説します。

実際の例を交えながら説明するので、これを読めばXMLファイルを安心して作れるようになります。

スポンサーリンク

XMLとは何か

XMLの基本概念

XML(エックスエムエル)は「Extensible Markup Language(拡張可能なマークアップ言語)」の略で、データを階層構造で表現するための言語です。

システム間でデータをやり取りするときや、設定ファイルなどで幅広く使われています。

HTMLとXMLの違い

特徴HTMLXML
目的Webページの表示データの構造化
タグ決められたタグ(h1、p、divなど)自由に定義可能
ルール比較的ゆるい厳格なルールが必要
エラー処理ブラウザが自動修正エラーになると動作停止

XMLが使われる場面

  • システム間のデータ交換:API通信、ファイル連携
  • 設定ファイル:アプリケーションの設定情報
  • 文書管理:Microsoft Office(.docx、.xlsx)の内部形式
  • Web フィード:RSS、Atom
  • データベース:XMLデータベースでの保存

XMLの厳格な文法ルール

XMLはHTMLよりもはるかに厳格なルールがあります。これらを守らないと、XMLパーサー(XMLを解析するプログラム)がエラーを出して処理を停止します。

ルール1:すべてのタグを正しく閉じる

基本的なタグの書き方

<!-- ✅ 正しい例 -->
<n>田中太郎</n>
<age>30</age>
<email>tanaka@example.com</email>

よくある間違い

<!-- ❌ 間違い:終了タグがない -->
<n>田中太郎
<age>30

空要素の書き方

内容を持たない要素は、自己終了タグ(セルフクロージングタグ)を使います:

<!-- ✅ 正しい例 -->
<br/>
<hr/>
<input type="text"/>

<!-- ✅ 別の書き方(同じ意味) -->
<br></br>
<hr></hr>
<input type="text"></input>

XMLとHTMLの違い

<!-- HTMLでは以下でもOK(ゆるい) -->
<br>
<hr>
<input type="text">
<!-- XMLでは必ず閉じる必要がある -->
<br/>
<hr/>
<input type="text"/>

ルール2:正しいネスト(入れ子)構造

正しいネストの例

<!-- ✅ 正しい例:開いた順番と逆順で閉じる -->
<person>
  <personal-info>
    <n>田中太郎</n>
    <age>30</age>
  </personal-info>
  <contact-info>
    <email>tanaka@example.com</email>
    <phone>090-1234-5678</phone>
  </contact-info>
</person>

間違ったネストの例

<!-- ❌ 間違い:タグの開閉順序が正しくない -->
<person>
  <personal-info>
    <n>田中太郎</personal-info>
    <age>30</age>
  </n>
</person>

ネスト構造の視覚化

正しいネスト構造は以下のように階層的になります:

person
├── personal-info
│   ├── name
│   └── age
└── contact-info
    ├── email
    └── phone

ルール3:大文字・小文字の厳密な区別

XMLでは大文字小文字が別物

<!-- これらはすべて異なる要素 -->
<Name>田中太郎</Name>
<name>田中太郎</name>
<NAME>田中太郎</NAME>
<nAmE>田中太郎</nAmE>

推奨される命名規則

ケバブケース(推奨)

<user-profile>
  <first-name>太郎</first-name>
  <last-name>田中</last-name>
  <birth-date>1990-01-01</birth-date>
</user-profile>

キャメルケース

<userProfile>
  <firstName>太郎</firstName>
  <lastName>田中</lastName>
  <birthDate>1990-01-01</birthDate>
</userProfile>

スネークケース

<user_profile>
  <first_name>太郎</first_name>
  <last_name>田中</last_name>
  <birth_date>1990-01-01</birth_date>
</user_profile>

ルール4:属性値の正しい記述

属性値は必ずクォートで囲む

<!-- ✅ 正しい例 -->
<person id="123" status="active">
  <n>田中太郎</n>
</person>

<!-- ❌ 間違い:クォートがない -->
<person id=123 status=active>
  <n>田中太郎</n>
</person>

ダブルクォートとシングルクォート

<!-- どちらも正しい -->
<person id="123" name="田中太郎"/>
<person id='123' name='田中太郎'/>

<!-- クォートが混在する場合 -->
<message text="He said 'Hello World'"/>
<message text='She said "Good morning"'/>

特殊文字のエスケープ

XMLでは以下の文字は特別な意味を持つため、データとして使用する場合はエスケープが必要です:

文字エスケープ説明
<&lt;小なり(タグの開始文字)
>&gt;大なり(タグの終了文字)
&&amp;アンパサンド(エスケープ文字)
"&quot;ダブルクォート
'&apos;アポストロフィ

特殊文字の使用例

<!-- ✅ 正しい例 -->
<formula>a &lt; b &amp;&amp; c &gt; d</formula>
<message>彼は&quot;こんにちは&quot;と言った</message>

<!-- ❌ 間違い:エスケープなし -->
<formula>a < b && c > d</formula>
<message>彼は"こんにちは"と言った</message>

ルール5:XML宣言の記述

基本的なXML宣言

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <!-- XMLの内容 -->
</root>

XML宣言の各部分の説明

  • version:XMLのバージョン(通常は1.0)
  • encoding:文字エンコーディング(UTF-8推奨)
  • standalone:外部参照の有無(オプション)

エンコーディングの種類

<!-- UTF-8(推奨) -->
<?xml version="1.0" encoding="UTF-8"?>

<!-- Shift_JIS(日本語環境) -->
<?xml version="1.0" encoding="Shift_JIS"?>

<!-- ISO-8859-1(西欧言語) -->
<?xml version="1.0" encoding="ISO-8859-1"?>

standalone属性

<!-- 外部参照なし -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<!-- 外部参照あり -->
<?xml version="1.0" encoding="UTF-8" standalone="no"?>

ルール6:ルート要素は一つだけ

正しいXML構造

<?xml version="1.0" encoding="UTF-8"?>
<users>
  <user id="1">
    <n>田中太郎</n>
  </user>
  <user id="2">
    <n>佐藤花子</n>
  </user>
</users>

間違った構造

<?xml version="1.0" encoding="UTF-8"?>
<!-- ❌ 間違い:ルート要素が複数 -->
<user id="1">
  <n>田中太郎</n>
</user>
<user id="2">
  <n>佐藤花子</n>
</user>

実践的なXMLの書き方

書籍管理システムの例

<?xml version="1.0" encoding="UTF-8"?>
<library>
  <book id="001" category="programming">
    <title>XML完全ガイド</title>
    <author>
      <first-name>太郎</first-name>
      <last-name>田中</last-name>
      <bio>システムエンジニア歴10年</bio>
    </author>
    <publisher>技術出版社</publisher>
    <publication-date>2024-01-15</publication-date>
    <price currency="JPY">2800</price>
    <isbn>978-4-12345-678-9</isbn>
    <description>
      XMLの基本から応用まで、実例を交えて
      わかりやすく解説した入門書です。
    </description>
    <tags>
      <tag>XML</tag>
      <tag>プログラミング</tag>
      <tag>データ形式</tag>
    </tags>
    <availability status="in-stock" quantity="25"/>
  </book>
  
  <book id="002" category="design">
    <title>Webデザインの基礎</title>
    <author>
      <first-name>花子</first-name>
      <last-name>佐藤</last-name>
      <bio>UIデザイナー</bio>
    </author>
    <publisher>デザイン出版</publisher>
    <publication-date>2024-02-20</publication-date>
    <price currency="JPY">3200</price>
    <isbn>978-4-98765-432-1</isbn>
    <description>
      現代的なWebデザインの手法を
      初心者向けに解説しています。
    </description>
    <tags>
      <tag>デザイン</tag>
      <tag>Web</tag>
      <tag>UI</tag>
    </tags>
    <availability status="out-of-stock" quantity="0"/>
  </book>
</library>

顧客管理システムの例

<?xml version="1.0" encoding="UTF-8"?>
<customers>
  <customer id="C001" type="premium">
    <personal-info>
      <name>
        <first>太郎</first>
        <last>田中</last>
        <full>田中太郎</full>
      </name>
      <birth-date>1985-03-15</birth-date>
      <gender>male</gender>
    </personal-info>
    
    <contact-info>
      <email primary="true">tanaka@example.com</email>
      <email>tanaka.work@company.com</email>
      <phone type="mobile">090-1234-5678</phone>
      <phone type="home">03-1234-5678</phone>
      <address type="home">
        <postal-code>100-0001</postal-code>
        <prefecture>東京都</prefecture>
        <city>千代田区</city>
        <street>千代田1-1-1</street>
        <building>サンプルマンション101</building>
      </address>
    </contact-info>
    
    <membership>
      <status>active</status>
      <level>premium</level>
      <start-date>2020-01-01</start-date>
      <points>1250</points>
    </membership>
    
    <preferences>
      <newsletter>true</newsletter>
      <sms-notifications>false</sms-notifications>
      <language>ja</language>
      <timezone>Asia/Tokyo</timezone>
    </preferences>
  </customer>
</customers>

XMLの記述で気をつけるポイント

命名規則

要素名の命名ルール

良い例

  • 意味が明確:<customer-name> vs <cn>
  • 一貫性がある:<first-name><last-name>
  • 読みやすい:<publication-date> vs <pubdt>

避けるべき例

<!-- ❌ 意味不明な省略 -->
<usr>
  <fn>太郎</fn>
  <ln>田中</ln>
</usr>

<!-- ✅ 明確な名前 -->
<user>
  <first-name>太郎</first-name>
  <last-name>田中</last-name>
</user>

属性と要素の使い分け

属性を使う場合

  • メタデータ(データについてのデータ)
  • 識別子(ID、種別など)
  • 短い値

要素を使う場合

  • 実際のデータ内容
  • 複数の値
  • 長いテキスト
<!-- 適切な使い分け -->
<book id="001" category="programming" in-stock="true">
  <title>XML完全ガイド</title>
  <description>
    XMLの基本から応用まで、実例を交えて
    わかりやすく解説した入門書です。
  </description>
  <tags>
    <tag>XML</tag>
    <tag>プログラミング</tag>
  </tags>
</book>

コメントの書き方

XMLコメントの基本

<!-- これはコメントです -->
<user>
  <!-- ユーザーの基本情報 -->
  <n>田中太郎</n>
  <!-- 
    複数行の
    コメントも可能
  -->
  <age>30</age>
</user>

コメントの注意点

<!-- ❌ コメント内に -- は使用不可 -->
<!-- これは -- 間違った -- コメントです -->

<!-- ✅ 正しいコメント -->
<!-- これは正しいコメントです -->

インデントと整形

読みやすい整形

<?xml version="1.0" encoding="UTF-8"?>
<library>
  <books>
    <book id="001">
      <title>XML入門</title>
      <author>
        <name>田中太郎</name>
        <email>tanaka@example.com</email>
      </author>
      <chapters>
        <chapter number="1">
          <title>XMLとは</title>
          <pages>20</pages>
        </chapter>
        <chapter number="2">
          <title>基本構文</title>
          <pages>30</pages>
        </chapter>
      </chapters>
    </book>
  </books>
</library>

インデントの推奨方法

  • 2スペースまたは4スペースで統一
  • タブ文字は避ける(環境依存の問題)
  • 一貫性を保つ(プロジェクト全体で統一)

よくあるエラーと対処法

エラー例1:タグの閉じ忘れ

エラーメッセージ例

Error: The element type "name" must be terminated by the matching end-tag "</name>".

修正前(エラー)

<user>
  <n>田中太郎
  <age>30</age>
</user>

修正後(正常)

<user>
  <n>田中太郎</n>
  <age>30</age>
</user>

エラー例2:ネストの順序間違い

エラーメッセージ例

Error: The end-tag for element type "name" does not match the start-tag.

修正前(エラー)

<user>
  <personal-info>
    <n>田中太郎</personal-info>
  </n>
</user>

修正後(正常)

<user>
  <personal-info>
    <n>田中太郎</n>
  </personal-info>
</user>

エラー例3:特殊文字のエスケープ漏れ

修正前(エラー)

<formula>if (a < b && c > d)</formula>

修正後(正常)

<formula>if (a &lt; b &amp;&amp; c &gt; d)</formula>

エラー例4:XML宣言の位置間違い

修正前(エラー)

<!-- コメント -->
<?xml version="1.0" encoding="UTF-8"?>
<root>
</root>

修正後(正常)

<?xml version="1.0" encoding="UTF-8"?>
<!-- コメント -->
<root>
</root>

XML検証ツールの活用

オンライン検証ツール

XMLValidator.com

  • URLにアクセスしてXMLを貼り付け
  • リアルタイムでエラーチェック
  • エラー行の特定が可能

W3C Markup Validator

  • 公式のXML検証ツール
  • 詳細なエラーレポート
  • 標準準拠の確認

エディタの検証機能

Visual Studio Code

拡張機能

  • XML Tools:XMLの整形、検証
  • XML Language Support:構文ハイライト

機能

  • リアルタイムエラー検出
  • 自動インデント
  • タグのペア表示

Notepad++

プラグイン

  • XML Tools:構文チェック、整形

機能

  • 構文ハイライト
  • タグの対応表示
  • 自動補完

コマンドライン検証

xmllint(Linux/Mac)

# XMLファイルの検証
xmllint --noout sample.xml

# 整形して出力
xmllint --format sample.xml

XML Starlet

# XMLの妥当性チェック
xml val sample.xml

# XPath クエリの実行
xml sel -t -v "//name" sample.xml

実用的な設計パターン

階層構造の設計

浅い階層(推奨)

<products>
  <product id="001">
    <name>商品A</name>
    <price>1000</price>
    <category>electronics</category>
  </product>
</products>

深すぎる階層(避ける)

<data>
  <products>
    <product-list>
      <product-item>
        <product-details>
          <product-info>
            <name>商品A</name>
          </product-info>
        </product-details>
      </product-item>
    </product-list>
  </products>
</data>

名前空間の活用

基本的な名前空間

<?xml version="1.0" encoding="UTF-8"?>
<library xmlns="http://example.com/library">
  <book>
    <title>XML入門</title>
  </book>
</library>

複数の名前空間

<?xml version="1.0" encoding="UTF-8"?>
<document 
  xmlns:lib="http://example.com/library"
  xmlns:auth="http://example.com/author">
  
  <lib:book>
    <lib:title>XML入門</lib:title>
    <auth:author>
      <auth:name>田中太郎</auth:name>
    </auth:author>
  </lib:book>
</document>

まとめ

XMLの基本ルール一覧

ルール重要度説明
タグの閉じ★★★すべてのタグを正しく閉じる
ネスト構造★★★開いた順番と逆順で閉じる
大文字小文字★★★厳密に区別される
属性のクォート★★★属性値は必ずクォートで囲む
XML宣言★★☆ファイル先頭に配置
ルート要素★★★一つだけにする
特殊文字★★☆適切にエスケープ

習得のステップ

初級レベル

  1. 基本的なタグの書き方をマスター
  2. よくあるエラーを理解
  3. 簡単なXMLファイルを作成

中級レベル

  1. 名前空間の活用
  2. 属性と要素の使い分け
  3. 効率的な構造設計

上級レベル

  1. **XMLスキーマ(XSD)**の作成
  2. XSLTによる変換
  3. 大規模XMLの設計

コメント

タイトルとURLをコピーしました