「XMLを見ていると、タグの中に何か値が書いてあるけど、あれって何?」
「データを入れるならタグと属性、どっちを使うのが正しいの?」
「属性って本当に必要なの?全部タグじゃダメなの?」
XMLはデータを整理して保存するために使われますが、タグと属性の使い分けで迷う人は多いです。
実際、多くの初心者が次のような疑問を持ちます:
- タグと属性の違いがよくわからない
- どちらを使うべきか判断基準がない
- 実際のプロジェクトでどう使い分けるの?
この記事では、XMLにおけるタグと属性について、基本的な概念から実際の使い方まで、初心者にもわかるように丁寧に解説します。
XMLのタグと属性の基礎

タグとは?
XMLではデータをタグで囲んで意味を表します。
基本的な構造
<name>田中太郎</name>
この例では:
<name>
:開始タグ</name>
:終了タグ田中太郎
:タグの内容(データ)
タグの役割
- データの意味を明確にする
- データを分類・整理する
- 階層構造を作る
階層構造の例
<person>
<name>田中太郎</name>
<age>30</age>
<address>
<city>東京都</city>
<street>新宿区1-1-1</street>
</address>
</person>
属性(アトリビュート)とは?
属性は、開始タグの中に追加情報として書く部分です。
基本的な書き方
<user id="001" type="vip">
<name>田中太郎</name>
</user>
この例では:
id="001"
:ユーザーのID(属性)type="vip"
:ユーザーの種別(属性)
属性の役割
- タグに関する補足情報を提供
- 識別子や分類情報を表現
- 処理方法の指示を含める
複数の属性を持つ例
<product id="P001" category="electronics" status="active" price="29800">
<name>ワイヤレスヘッドホン</name>
<description>高音質のBluetooth対応ヘッドホン</description>
</product>
空要素での属性
内容を持たないタグでも属性は使えます:
<image src="photo.jpg" width="300" height="200" />
<line-break />
<meta charset="UTF-8" />
タグと属性の違いを詳しく解説

構造的な違い
項目 | タグ | 属性 |
---|---|---|
目的 | データそのものを表す | タグの補足情報を表す |
階層性 | 子要素を持てる | 値だけ(階層化不可) |
複数の値 | 複数の子要素で表現可能 | 1つの属性につき1つの値のみ |
順序 | 順序に意味を持たせられる | 順序は通常無意味 |
具体例で比較
タグを使った場合
<book>
<title>XMLプログラミング入門</title>
<author>山田太郎</author>
<author>佐藤花子</author>
<published-year>2025</published-year>
<page-count>350</page-count>
</book>
属性を使った場合
<book title="XMLプログラミング入門"
author="山田太郎"
published-year="2025"
page-count="350">
</book>
どちらが良い?
タグ版のメリット:
- 複数の著者を表現できる
- 将来的に著者の詳細情報(経歴など)を追加しやすい
- 構造が明確
属性版のメリット:
- コンパクトに書ける
- 属性の値で簡単に検索できる
技術的な違い
XMLパーサーでの扱い
<!-- タグの場合 -->
<title>XMLガイド</title>
<!-- アクセス: element.textContent -->
<!-- 属性の場合 -->
<book title="XMLガイド">
<!-- アクセス: element.getAttribute("title") -->
XPathでの検索
/* タグの場合 */
//book[title="XMLガイド"]
/* 属性の場合 */
//book[@title="XMLガイド"]
実例でわかるタグと属性の使い分け

例1:顧客管理システム
推奨される設計
<customer id="C1001" status="active" created="2025-01-15">
<personal-info>
<name>田中太郎</name>
<age>30</age>
<gender>男性</gender>
</personal-info>
<contact>
<email>tanaka@example.com</email>
<phone>03-1234-5678</phone>
<address>
<postal-code>160-0023</postal-code>
<prefecture>東京都</prefecture>
<city>新宿区</city>
<street>西新宿1-1-1</street>
</address>
</contact>
<purchase-history>
<purchase date="2025-01-10" amount="15000">
<item id="I001">ノートパソコン</item>
</purchase>
<purchase date="2025-02-05" amount="3000">
<item id="I002">マウス</item>
</purchase>
</purchase-history>
</customer>
属性として使っているもの
id
:顧客の一意識別子status
:顧客の状態(アクティブ、非アクティブなど)created
:作成日(メタデータ)date
:購入日amount
:購入金額
タグとして使っているもの
- 名前、年齢、住所などの具体的なデータ
- 将来的に詳細情報を追加する可能性があるもの
例2:商品カタログ
<catalog version="2.1" last-updated="2025-07-03T10:30:00Z">
<category id="electronics" name="電子機器">
<product sku="EL001" status="in-stock" featured="true">
<name>スマートフォン</name>
<brand>TechBrand</brand>
<price currency="JPY">89800</price>
<specifications>
<screen size="6.1" resolution="1080x2400" />
<memory ram="8GB" storage="128GB" />
<camera main="48MP" front="12MP" />
</specifications>
<description>
最新のプロセッサを搭載した高性能スマートフォン。
優れたカメラ性能とバッテリー持続時間を実現。
</description>
<keywords>
<keyword>スマートフォン</keyword>
<keyword>高性能</keyword>
<keyword>カメラ</keyword>
</keywords>
</product>
</category>
</catalog>
例3:設定ファイル
<configuration format-version="1.0">
<database type="mysql" connection-timeout="30">
<host>localhost</host>
<port>3306</port>
<database-name>shop_db</database-name>
<credentials>
<username>db_user</username>
<password encrypted="true">encrypted_password_here</password>
</credentials>
<connection-pool min-size="5" max-size="20" />
</database>
<logging level="INFO" rotation="daily">
<console enabled="true" />
<file path="/var/log/app.log" max-size="10MB" />
</logging>
<cache provider="redis" ttl="3600">
<server host="127.0.0.1" port="6379" />
</cache>
</configuration>
使い分けの基本ルール

属性を使うべき場合
1. 識別子・ID
<user id="12345">
<product sku="ABC-001">
<order number="ORD-2025-001">
2. メタデータ(データについてのデータ)
<document created="2025-07-03" modified="2025-07-05" author="yamada">
<image format="JPEG" width="800" height="600">
<price currency="USD" tax-included="true">
3. 設定値・フラグ
<feature enabled="true">
<option selected="false">
<cache disabled="false">
4. 短い単純な値
<rectangle width="100" height="50">
<person age="30" gender="male">
<book pages="350" language="ja">
タグを使うべき場合
1. 主要なデータ内容
<title>XMLプログラミング入門</title>
<description>この本はXMLの基礎から応用まで学べます</description>
<content>ここに本文が入ります...</content>
2. 構造化されたデータ
<address>
<street>新宿区1-1-1</street>
<city>東京都</city>
<postal-code>160-0023</postal-code>
</address>
3. 繰り返し可能なデータ
<authors>
<author>山田太郎</author>
<author>佐藤花子</author>
<author>鈴木一郎</author>
</authors>
4. 将来的に拡張される可能性があるデータ
<!-- 現在 -->
<author>山田太郎</author>
<!-- 将来的に拡張 -->
<author>
<name>山田太郎</name>
<bio>ITエンジニア。XML技術に詳しい。</bio>
<social-media>
<twitter>@yamada_tech</twitter>
</social-media>
</author>
よくある疑問と注意点

Q1: データを全部属性に入れてはいけないの?
属性だけのパターン(非推奨)
<user name="田中太郎" age="30" email="tanaka@example.com" phone="090-1234-5678" />
問題点
- 拡張性が低い:将来的に情報を追加しにくい
- 可読性が悪い:属性が多いと読みにくい
- 制限が多い:属性値には特殊文字が使いにくい
推奨パターン
<user id="U001" status="active">
<name>田中太郎</name>
<age>30</age>
<contact>
<email>tanaka@example.com</email>
<phone>090-1234-5678</phone>
</contact>
</user>
Q2: 属性の値に日本語を使っていいの?
技術的には可能
<?xml version="1.0" encoding="UTF-8"?>
<商品 名前="ノートパソコン" カテゴリ="電子機器">
<価格>89800</価格>
</商品>
実際の推奨事項
<?xml version="1.0" encoding="UTF-8"?>
<product name="ノートパソコン" category="電子機器">
<price>89800</price>
</product>
理由:
- 国際的な互換性
- システム間での連携のしやすさ
- 開発ツールのサポート状況
Q3: 属性の順序は重要?
結論:順序は重要ではない
以下は同じ意味:
<product id="001" name="商品A" price="1000">
<product name="商品A" price="1000" id="001">
<product price="1000" id="001" name="商品A">
ただし、可読性のために統一した順序を保つのが良い:
<!-- 推奨:重要な属性から順に -->
<product id="001" name="商品A" category="electronics" price="1000" status="active">
Q4: 属性値にスペースや特殊文字は使える?
使える文字と注意点
<!-- OK:スペースを含む値 -->
<person name="田中 太郎">
<!-- OK:数値 -->
<item price="1,250.50">
<!-- 注意が必要:特殊文字 -->
<message text="彼は「こんにちは」と言った">
エスケープが必要な文字
文字 | エスケープ記法 | 例 |
---|---|---|
< | < | text="x < y" |
> | > | text="x > y" |
& | & | text="Tom & Jerry" |
" | " | text="彼は"こんにちは"と言った" |
' | ' | text='彼は'元気だ'と言った' |
XMLスキーマ(XSD)での属性定義
基本的な属性定義
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="product">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="price" type="xs:decimal"/>
</xs:sequence>
<!-- 属性の定義 -->
<xs:attribute name="id" type="xs:string" use="required"/>
<xs:attribute name="category" type="xs:string" use="optional"/>
<xs:attribute name="featured" type="xs:boolean" default="false"/>
</xs:complexType>
</xs:element>
</xs:schema>
属性の制約
列挙型の属性
<xs:attribute name="status">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="active"/>
<xs:enumeration value="inactive"/>
<xs:enumeration value="discontinued"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
パターン制約
<xs:attribute name="product-code">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[A-Z]{2}-[0-9]{4}"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
実践的な設計パターン

パターン1:ドキュメント型XML
<article id="ART001" language="ja" published="2025-07-03">
<metadata>
<title>XMLの基本概念</title>
<author>
<name>山田太郎</name>
<email>yamada@example.com</email>
</author>
<keywords>
<keyword>XML</keyword>
<keyword>マークアップ</keyword>
<keyword>データ構造</keyword>
</keywords>
</metadata>
<content>
<section title="はじめに">
<paragraph>XMLは構造化されたデータを表現するための...</paragraph>
</section>
<section title="基本概念">
<paragraph>XMLの基本的な要素について説明します...</paragraph>
</section>
</content>
</article>
パターン2:データベース型XML
<employees>
<employee id="EMP001" department="engineering" hire-date="2020-04-01">
<personal>
<name>田中太郎</name>
<birthdate>1990-05-15</birthdate>
<gender>male</gender>
</personal>
<position>
<title>シニアエンジニア</title>
<salary currency="JPY">6000000</salary>
<manager-id>EMP005</manager-id>
</position>
<skills>
<skill name="Java" level="expert"/>
<skill name="Python" level="intermediate"/>
<skill name="XML" level="advanced"/>
</skills>
</employee>
</employees>
パターン3:設定ファイル型XML
<application-config version="1.2">
<server host="localhost" port="8080" protocol="https">
<ssl enabled="true"
certificate="/path/to/cert.pem"
private-key="/path/to/key.pem"/>
<session timeout="30" secure="true"/>
</server>
<features>
<feature name="user-registration" enabled="true"/>
<feature name="email-notifications" enabled="false"/>
<feature name="advanced-search" enabled="true" experimental="true"/>
</features>
<limits>
<upload max-file-size="10MB" allowed-types="jpg,png,pdf"/>
<api requests-per-minute="100" burst-limit="150"/>
</limits>
</application-config>
ベストプラクティス
1. 一貫性のある命名規則
推奨する命名規則
<!-- ケバブケース(推奨) -->
<product-info category="electronics">
<model-number>ABC-123</model-number>
<release-date>2025-01-15</release-date>
</product-info>
<!-- スネークケース -->
<product_info category="electronics">
<model_number>ABC-123</model_number>
<release_date>2025-01-15</release_date>
</product_info>
<!-- キャメルケース -->
<productInfo category="electronics">
<modelNumber>ABC-123</modelNumber>
<releaseDate>2025-01-15</releaseDate>
</productInfo>
2. 属性vs要素の判断フローチャート
データの種類を考える
↓
識別子やメタデータ? → YES → 属性を使用
↓ NO
短い単純な値? → YES → 属性を検討
↓ NO
複数の値が必要? → YES → 要素を使用
↓ NO
将来的に拡張する可能性? → YES → 要素を使用
↓ NO
属性または要素(どちらでも可)
3. 名前空間の活用
<root xmlns:prod="http://example.com/product"
xmlns:meta="http://example.com/metadata">
<prod:catalog meta:version="1.0" meta:created="2025-07-03">
<prod:item prod:id="123" prod:category="electronics">
<prod:name>スマートフォン</prod:name>
<meta:tags>
<meta:tag>mobile</meta:tag>
<meta:tag>technology</meta:tag>
</meta:tags>
</prod:item>
</prod:catalog>
</root>
まとめ
今回は「XMLのタグと属性」について詳しく解説しました。
重要なポイント
- タグと属性の役割を理解する
- タグ:データそのものを表現
- 属性:タグの補足情報を表現
- 適切な使い分けができる
- 識別子やメタデータ → 属性
- 主要なデータや構造化されたデータ → タグ
- 将来の拡張性を考慮する
- 変更される可能性が高い → タグ
- 固定的な情報 → 属性
- 一貫性のあるルールを作る
- プロジェクト内で統一された命名規則
- 明確な使い分け基準
使い分けの指針
用途 | 推奨 | 理由 |
---|---|---|
識別子(ID) | 属性 | 簡潔で検索しやすい |
メタデータ | 属性 | 管理情報として分離 |
主要データ | タグ | 拡張性と可読性 |
構造化データ | タグ | 階層構造を表現可能 |
繰り返しデータ | タグ | 複数の値を表現可能 |
コメント