「XMLのサンプルを見ていたら、タグに id="001"
とか type="vip"
とか書いてあるけど、これって何?」
「データを入れるならタグとアトリビュート、どっちを使えばいいの?」
「属性の値にはどんな制限があるの?」
XMLを使い始めたばかりの人が最初に疑問に思うポイントの一つが「アトリビュート(属性)」です。
タグの中にそっと書かれたこの部分には、実は大事な意味があります。
正しく理解して使えるようになると、XMLの設計がぐっと上手になります。
この記事では、XMLにおけるアトリビュート(属性)について、基本的な概念から実際の使い方、注意点まで、初心者向けにやさしく解説します。
XMLのアトリビュート(属性)とは?

アトリビュート(属性)の意味
アトリビュート(英語:attribute)は、タグに追加情報を持たせるための仕組みです。
日本語では「属性」と呼ばれることが多く、そのタグが表すデータについての「特徴」や「性質」を表現します。
基本的な例
<user id="001" type="vip">
<name>田中太郎</name>
</user>
この例では:
id="001"
:ユーザーの識別番号type="vip"
:ユーザーの種類(VIP顧客)
このように、user
というデータに「IDは001」「種類はVIP」という追加情報を持たせています。
アトリビュートの役割
データの分類・識別
<product id="P001" category="electronics">
<name>スマートフォン</name>
</product>
処理方法の指定
<image src="photo.jpg" width="300" height="200" />
<text font-size="14" color="blue">重要なお知らせ</text>
メタデータの表現
<document created="2025-07-03" author="yamada" version="1.2">
<title>XMLガイド</title>
</document>
アトリビュートの特徴
1. タグに紐づく情報
アトリビュートは必ずタグに付随する情報です。タグなしで単独では存在できません。
2. 単一の値
1つのアトリビュートには1つの値しか入れられません。
3. 階層構造を持てない
アトリビュートの値は文字列のみで、子要素を持つことはできません。
XMLでのアトリビュートの書き方

基本構文
<タグ名 属性名="値" 属性名2="値2">
内容
</タグ名>
重要なルール
- アトリビュートは開始タグ(
<タグ名 ...>
)の中に書きます - 値は必ずクォーテーションで囲みます
- ダブルクォーテーション(”)またはシングルクォーテーション(’)を使用
具体的な例
商品データの例
<product sku="A123" category="book" price="1500">
<title>XML入門</title>
<author>山田太郎</author>
</product>
顧客データの例
<customer id="C001" status="active" registered="2025-01-15">
<name>佐藤花子</name>
<email>sato@example.com</email>
</customer>
複数のアトリビュートを書く場合
<book isbn="978-4-12345-678-9"
language="ja"
pages="350"
published="2025-07-01"
format="paperback">
<title>XMLマスターガイド</title>
</book>
読みやすい書き方のコツ
- スペースで区切る:アトリビュート同士の間にスペースを入れる
- 改行で整理:アトリビュートが多い場合は改行して見やすくする
- 順序を統一:重要なものから順に書く
アトリビュートの値の書き方

クォーテーションの使い方
ダブルクォーテーション
<person name="田中太郎" age="30">
シングルクォーテーション
<person name='田中太郎' age='30'>
混在する場合
<message text="彼は'こんにちは'と言った">
<message text='彼は"こんにちは"と言った'>
特殊文字のエスケープ
アトリビュートの値に特殊文字が含まれる場合は、エスケープが必要です。
文字 | エスケープ記法 | 使用例 |
---|---|---|
" | " | text="彼は"こんにちは"と言った" |
' | ' | text='彼は'こんにちは'と言った' |
< | < | condition="x < y" |
> | > | condition="x > y" |
& | & | company="Tom & Jerry Inc." |
実際の例
<product name=""最高の"スマートフォン"
description="x < y の場合に最適"
manufacturer="Apple & Samsung">
</product>
タグとアトリビュートの使い分け
基本的な考え方
項目 | タグ(要素) | アトリビュート(属性) |
---|---|---|
主な使い方 | データそのもの | データの補足情報 |
例 | <name>田中</name> | <user type="vip"> |
階層構造 | 子要素を入れられる | 入れられない(単なる値) |
複数の値 | 複数の子要素で表現可能 | 1つの属性につき1つの値 |
検索のしやすさ | XPathで検索可能 | 属性値での検索も可能 |
実践的な使い分け例
推奨される設計
<order id="ORD001" status="pending" created="2025-07-03">
<customer>
<name>田中太郎</name>
<email>tanaka@example.com</email>
</customer>
<items>
<item id="ITEM001" quantity="2">
<name>ノートパソコン</name>
<price>89800</price>
</item>
<item id="ITEM002" quantity="1">
<name>マウス</name>
<price>2500</price>
</item>
</items>
<total>182100</total>
</order>
アトリビュートとして使っているもの
id
:識別子status
:状態created
:作成日時quantity
:数量
タグとして使っているもの
name
:名前(メインデータ)email
:メールアドレス(メインデータ)price
:価格(メインデータ)total
:合計金額(メインデータ)
悪い例(非推奨)
<!-- 全てをアトリビュートにした場合(非推奨) -->
<order id="ORD001"
customer-name="田中太郎"
customer-email="tanaka@example.com"
item1-name="ノートパソコン"
item1-price="89800"
item1-quantity="2"
item2-name="マウス"
item2-price="2500"
item2-quantity="1"
total="182100" />
この例の問題点
- 可読性が悪い:どこに何が書いてあるかわからない
- 拡張性が低い:商品が増えるとアトリビュートも増える
- 構造が不明確:データの階層関係がわからない
アトリビュートの実用的な使い方

パターン1:識別子として使用
<employees>
<employee id="EMP001" department="engineering">
<name>田中太郎</name>
<position>シニアエンジニア</position>
</employee>
<employee id="EMP002" department="sales">
<name>佐藤花子</name>
<position>営業マネージャー</position>
</employee>
</employees>
パターン2:状態や種類の表現
<products>
<product id="P001" status="active" featured="true">
<name>スマートフォン</name>
<price>89800</price>
</product>
<product id="P002" status="discontinued" featured="false">
<name>古いタブレット</name>
<price>19800</price>
</product>
</products>
パターン3:表示や処理の指定
<document>
<paragraph align="center" font-size="16">
見出し部分
</paragraph>
<paragraph align="left" font-size="12">
本文の内容がここに入ります。
</paragraph>
<image src="chart.png" width="400" height="300" alt="売上グラフ" />
</document>
パターン4:メタデータの表現
<blog-post id="POST001"
published="2025-07-03T10:30:00Z"
author="yamada"
category="technology"
tags="xml,programming,tutorial">
<title>XMLの基本的な使い方</title>
<content>
この記事では、XMLの基本的な使い方について説明します...
</content>
</blog-post>
よくある疑問と回答

Q1: アトリビュートに日本語を使ってもいいの?
技術的には可能
UTF-8で保存していれば、アトリビュート名や値に日本語を使用できます。
<?xml version="1.0" encoding="UTF-8"?>
<商品 名前="ノートパソコン" 価格="89800">
<説明>高性能なビジネス向けノートパソコン</説明>
</商品>
実際の推奨事項
<?xml version="1.0" encoding="UTF-8"?>
<product name="ノートパソコン" price="89800">
<description>高性能なビジネス向けノートパソコン</description>
</product>
推奨する理由
- 国際的な互換性:海外のシステムでも問題なく動作
- 開発ツールの対応:多くのエディタやツールで適切に表示
- 文字化けリスク:文字エンコーディングの問題を回避
Q2: アトリビュートには複数の値を入れられる?
基本的には単一の値
アトリビュートは基本的に単一の文字列です。
<!-- これは1つの文字列として扱われる -->
<user roles="admin user editor" />
複数の値を扱いたい場合の解決策
方法1:子要素として表現
<user id="U001">
<roles>
<role>admin</role>
<role>user</role>
<role>editor</role>
</roles>
</user>
方法2:区切り文字を使用
<user id="U001" roles="admin,user,editor" />
方法3:複数のアトリビュートを使用
<user id="U001" role1="admin" role2="user" role3="editor" />
推奨される方法
複雑なデータは子要素として表現するのが最も適切です。
Q3: アトリビュートの順序は重要?
基本的には順序は無関係
以下は全て同じ意味です:
<product id="P001" name="商品A" price="1000">
<product name="商品A" price="1000" id="P001">
<product price="1000" id="P001" name="商品A">
可読性のための推奨順序
- 識別子(id など)
- 重要な分類(type、category など)
- 状態(status など)
- その他の情報
<product id="P001" category="electronics" status="active" featured="true">
Q4: アトリビュートの値は空にできる?
空の値は設定可能
<user id="U001" middle-name="" last-login="">
<name>田中太郎</name>
</user>
より良い設計方法
<user id="U001">
<name>田中太郎</name>
<!-- middle-name がない場合は要素自体を省略 -->
<!-- last-login がない場合は要素自体を省略 -->
</user>
XMLスキーマでのアトリビュート制御

基本的なアトリビュート定義
<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="id" type="xs:string" use="required"/>
<xs:attribute name="description" type="xs:string" use="optional"/>
デフォルト値の設定
<xs:attribute name="status" type="xs:string" default="active"/>
<xs:attribute name="visible" type="xs:boolean" default="true"/>
値の制限(列挙型)
<xs:attribute name="size">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="small"/>
<xs:enumeration value="medium"/>
<xs:enumeration value="large"/>
</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>
プログラミングでのアトリビュート操作
JavaScript(DOM)での操作
// XMLの読み込み
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(xmlText, "text/xml");
// アトリビュートの取得
const product = xmlDoc.getElementsByTagName("product")[0];
const productId = product.getAttribute("id");
const category = product.getAttribute("category");
console.log("商品ID:", productId);
console.log("カテゴリ:", category);
// アトリビュートの設定
product.setAttribute("status", "active");
product.setAttribute("featured", "true");
// アトリビュートの削除
product.removeAttribute("old-attribute");
Python(xml.etree.ElementTree)での操作
import xml.etree.ElementTree as ET
# XMLの読み込み
tree = ET.parse('products.xml')
root = tree.getroot()
# アトリビュートの取得
for product in root.findall('product'):
product_id = product.get('id')
category = product.get('category', 'unknown') # デフォルト値指定
print(f"商品ID: {product_id}, カテゴリ: {category}")
# アトリビュートの設定
product.set('status', 'active')
product.set('last-updated', '2025-07-03')
# ファイルに保存
tree.write('products_updated.xml', encoding='utf-8', xml_declaration=True)
Java(JDOM)での操作
import org.jdom2.*;
import org.jdom2.input.SAXBuilder;
// XMLの読み込み
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build("products.xml");
Element root = doc.getRootElement();
// アトリビュートの取得
List<Element> products = root.getChildren("product");
for (Element product : products) {
String id = product.getAttributeValue("id");
String category = product.getAttributeValue("category");
System.out.println("商品ID: " + id + ", カテゴリ: " + category);
// アトリビュートの設定
product.setAttribute("status", "active");
product.setAttribute("last-updated", "2025-07-03");
}
実際のプロジェクトでの活用例

Webサービス設定ファイル
<web-app version="3.1" xmlns="http://java.sun.com/xml/ns/javaee">
<servlet>
<servlet-name>ApiServlet</servlet-name>
<servlet-class>com.example.ApiServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ApiServlet</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
<filter>
<filter-name>AuthFilter</filter-name>
<filter-class>com.example.AuthFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>/api/*</url-pattern>
</filter-mapping>
</web-app>
データベース設定
<configuration>
<datasource name="main" type="mysql" pool-size="10">
<connection-url>jdbc:mysql://localhost:3306/mydb</connection-url>
<username>dbuser</username>
<password encrypted="true">encrypted_password</password>
<properties>
<property name="useSSL" value="false"/>
<property name="characterEncoding" value="UTF-8"/>
</properties>
</datasource>
<cache provider="redis" ttl="3600" max-entries="1000">
<server host="localhost" port="6379"/>
</cache>
</configuration>
電子商取引データ
<order id="ORD20250703001"
customer-id="CUST12345"
order-date="2025-07-03T14:30:00Z"
status="processing"
currency="JPY"
tax-rate="0.10">
<shipping-address>
<name>田中太郎</name>
<postal-code>160-0023</postal-code>
<prefecture>東京都</prefecture>
<city>新宿区</city>
<address>西新宿1-1-1</address>
</shipping-address>
<items>
<item product-id="PROD001" quantity="2" unit-price="15000">
<name>ワイヤレスマウス</name>
<category>PC周辺機器</category>
</item>
<item product-id="PROD002" quantity="1" unit-price="3500">
<name>キーボード</name>
<category>PC周辺機器</category>
</item>
</items>
<totals>
<subtotal>33500</subtotal>
<tax>3350</tax>
<shipping>500</shipping>
<total>37350</total>
</totals>
</order>
ベストプラクティス
1. 明確な命名規則
推奨される命名
<!-- ケバブケース(推奨) -->
<product product-id="P001" category-name="electronics">
<!-- スネークケース -->
<product product_id="P001" category_name="electronics">
<!-- キャメルケース -->
<product productId="P001" categoryName="electronics">
2. 一貫性の保持
良い例:統一されたルール
<catalog>
<product id="P001" status="active" featured="true">
<name>商品A</name>
</product>
<product id="P002" status="inactive" featured="false">
<name>商品B</name>
</product>
</catalog>
悪い例:バラバラなルール
<catalog>
<product id="P001" Status="active" is_featured="true">
<name>商品A</name>
</product>
<product productId="P002" status="inactive" featured="0">
<name>商品B</name>
</product>
</catalog>
3. 適切な型の使用
<!-- 数値 -->
<item quantity="10" price="1500.50">
<!-- 真偽値 -->
<product featured="true" discontinued="false">
<!-- 日付時刻 -->
<order created="2025-07-03T14:30:00Z">
<!-- 列挙値 -->
<user status="active" role="admin">
まとめ
今回は「XMLのアトリビュート(属性)」について詳しく解説しました。
重要なポイント
- アトリビュートの役割を理解する
- タグの補足情報を表現
- 識別子やメタデータに最適
- 単一の値のみ保存可能
- 適切な使い分けができる
- メインデータ → タグ
- 補足情報 → アトリビュート
- 書き方のルールを守る
- 値は必ずクォーテーションで囲む
- 特殊文字は適切にエスケープ
- 一貫性のある命名規則
- XMLスキーマで制約を定義
- 必須・任意の指定
- デフォルト値の設定
- 値の制限
アトリビュートの活用指針
用途 | 推奨度 | 理由 |
---|---|---|
識別子(ID) | ★★★ | 検索・参照に最適 |
状態・フラグ | ★★★ | 処理の制御に便利 |
メタデータ | ★★★ | データの管理情報 |
設定値 | ★★☆ | 簡潔な表現が可能 |
主要データ | ★☆☆ | タグの方が適切 |
コメント