「XMLファイルを自分で書かないといけなくなったけど、何に気をつければいいの?」
「タグの閉じ忘れでエラーが出るって聞いたけど、具体的にどう書けばいいの?」
そんな疑問を持つ方のために、この記事ではXMLの書き方と守るべき基本ルールを、初心者にもわかるように丁寧に解説します。
実際の例を交えながら説明するので、これを読めばXMLファイルを安心して作れるようになります。
XMLとは何か

XMLの基本概念
XML(エックスエムエル)は「Extensible Markup Language(拡張可能なマークアップ言語)」の略で、データを階層構造で表現するための言語です。
システム間でデータをやり取りするときや、設定ファイルなどで幅広く使われています。
HTMLとXMLの違い
特徴 | HTML | XML |
---|---|---|
目的 | 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では以下の文字は特別な意味を持つため、データとして使用する場合はエスケープが必要です:
文字 | エスケープ | 説明 |
---|---|---|
< | < | 小なり(タグの開始文字) |
> | > | 大なり(タグの終了文字) |
& | & | アンパサンド(エスケープ文字) |
" | " | ダブルクォート |
' | ' | アポストロフィ |
特殊文字の使用例
<!-- ✅ 正しい例 -->
<formula>a < b && c > d</formula>
<message>彼は"こんにちは"と言った</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 < b && c > 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宣言 | ★★☆ | ファイル先頭に配置 |
ルート要素 | ★★★ | 一つだけにする |
特殊文字 | ★★☆ | 適切にエスケープ |
習得のステップ
初級レベル
- 基本的なタグの書き方をマスター
- よくあるエラーを理解
- 簡単なXMLファイルを作成
中級レベル
- 名前空間の活用
- 属性と要素の使い分け
- 効率的な構造設計
上級レベル
- **XMLスキーマ(XSD)**の作成
- XSLTによる変換
- 大規模XMLの設計
コメント