「XMLの属性って何?」
「どんな属性があって、どう使うの?」
XMLファイルを見ていると、要素の中に「属性」というものが書かれていますよね。この属性を理解することで、XMLをより効果的に使えるようになります。
この記事では、XMLの属性について、基本から実践的な使い方まで詳しく解説していきます。よく使われる属性の一覧も紹介するので、すぐに活用できますよ。
属性とは?

まず、基本的な概念から説明しますね。
属性の基本
属性(Attribute)とは、要素に追加情報を付与するための仕組みです。
基本的な構文:
<要素名 属性名="属性値">
実例:
<product id="001" category="electronics" stock="50">
<name>ノートPC</name>
</product>
この例では、id、category、stockが属性です。
要素との違い
要素との比較:
要素で表現:
<product>
<id>001</id>
<category>electronics</category>
<name>ノートPC</name>
</product>
属性で表現:
<product id="001" category="electronics">
<name>ノートPC</name>
</product>
どちらも同じ情報を表現できますが、使い分けが重要です。
属性の書き方の基本ルール
XMLの属性には、守るべきルールがあります。
ルール1:属性値は必ず引用符で囲む
正しい書き方:
<product id="001">
間違い:
<product id=001>
シングルクォートでもOKです:
<product id='001'>
ルール2:1つの要素に同じ属性は1回だけ
間違い:
<product id="001" id="002">
同じ属性を複数回書くことはできません。
ルール3:属性の順序は自由
<!-- どちらも正しい -->
<product id="001" category="electronics">
<product category="electronics" id="001">
順序に意味はありませんが、統一すると読みやすくなります。
ルール4:空白を含む場合も引用符内に
<product name="ノート パソコン">
スペースがあっても、引用符で囲めば問題ありません。
ルール5:特殊文字はエスケープする
エスケープが必要な文字:
<product description="100" screen"> <!-- " → " -->
<product description="A & B"> <!-- & → & -->
<product description="value < 10"> <!-- < → < -->
XMLの標準属性(グローバル属性)
すべてのXML要素で使える標準的な属性です。
xml:lang(言語指定)
要素の言語を指定します。
使用例:
<document>
<title xml:lang="ja">XMLの教科書</title>
<title xml:lang="en">XML Textbook</title>
<description xml:lang="ja">
XMLの基礎から応用まで学べます
</description>
</document>
言語コード例:
ja:日本語en:英語zh:中国語ko:韓国語fr:フランス語
xml:space(空白の扱い)
空白文字の扱い方を指定します。
使用例:
<code xml:space="preserve">
function hello() {
console.log("Hello");
}
</code>
値の種類:
preserve:空白をそのまま保持default:通常の処理(連続する空白を1つに)
xml:id(一意な識別子)
要素に一意のIDを付けます。
使用例:
<document>
<section xml:id="intro">
<title>はじめに</title>
</section>
<section xml:id="chapter1">
<title>第1章</title>
</section>
</document>
特徴:
- 文書内で一意でなければならない
- アルファベットで始まる必要がある
xml:base(ベースURI)
相対パスの基準となるURIを指定します。
使用例:
<document xml:base="http://example.com/docs/">
<link href="page1.html"/> <!-- http://example.com/docs/page1.html -->
<link href="page2.html"/> <!-- http://example.com/docs/page2.html -->
</document>
XML Schemaでよく使う属性
XMLスキーマで定義に使う属性です。
xmlns(名前空間の宣言)
<root xmlns="http://example.com/schema">
<item>データ</item>
</root>
xmlns:xsi(スキーマインスタンス)
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
</root>
xsi:schemaLocation(スキーマの場所)
<root
xmlns="http://example.com/schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://example.com/schema schema.xsd">
</root>
xsi:type(データ型の指定)
<value xsi:type="xs:integer">123</value>
<value xsi:type="xs:string">text</value>
xsi:nil(NULL値)
<value xsi:nil="true"/>
NULL値を表現します。
用途別の属性例
実際によく使われる属性を用途別に紹介します。
ID・識別子系
<!-- 商品ID -->
<product id="P001" sku="ABC-123">
<!-- ユーザーID -->
<user id="12345" username="yamada">
<!-- ドキュメントID -->
<document ref="DOC-2024-001">
分類・カテゴリ系
<!-- カテゴリ -->
<product category="electronics" subcategory="computers">
<!-- タイプ -->
<item type="book" format="paperback">
<!-- クラス -->
<element class="important" level="high">
日付・時刻系
<!-- 作成日 -->
<article created="2024-11-14" modified="2024-11-14">
<!-- 有効期限 -->
<coupon valid-from="2024-01-01" valid-until="2024-12-31">
<!-- タイムスタンプ -->
<event timestamp="2024-11-14T10:30:00Z">
数値・数量系
<!-- 価格 -->
<product price="2800" currency="JPY">
<!-- 在庫 -->
<item stock="50" min-stock="10" max-stock="100">
<!-- サイズ -->
<image width="800" height="600" size="1024000">
状態・フラグ系
<!-- ステータス -->
<order status="shipped" paid="true">
<!-- 有効/無効 -->
<feature enabled="true" active="false">
<!-- 可視性 -->
<element visible="true" hidden="false">
URL・リンク系
<!-- リンク -->
<link href="http://example.com" target="_blank">
<!-- 画像ソース -->
<image src="photo.jpg" alt="写真の説明">
<!-- 参照 -->
<reference url="http://example.com" rel="external">
言語・地域系
<!-- 言語 -->
<text lang="ja" country="JP">
<!-- ロケール -->
<content locale="ja_JP" charset="UTF-8">
スタイル・表示系
<!-- 色 -->
<text color="#FF0000" bgcolor="#FFFFFF">
<!-- フォント -->
<text font="Arial" size="12" weight="bold">
<!-- 配置 -->
<element align="center" valign="middle">
HTML/SVGでよく使う属性

XMLベースのHTML/SVGでの属性例です。
HTML属性
<!-- リンク -->
<a href="page.html" target="_blank" rel="noopener">
<!-- 画像 -->
<img src="image.jpg" alt="説明" width="300" height="200"/>
<!-- 入力フォーム -->
<input type="text" name="username" value="" placeholder="ユーザー名"/>
<!-- ボタン -->
<button type="submit" disabled="disabled">送信</button>
SVG属性
<!-- 円 -->
<circle cx="50" cy="50" r="40" fill="red" stroke="black" stroke-width="2"/>
<!-- 矩形 -->
<rect x="10" y="10" width="100" height="50" fill="blue"/>
<!-- パス -->
<path d="M10 10 L90 90" stroke="black" stroke-width="2"/>
<!-- テキスト -->
<text x="50" y="50" font-size="16" fill="black">テキスト</text>
属性と要素の使い分け
どちらを使うべきか、判断基準を紹介します。
属性を使うべきケース
以下の場合は属性が適切:
- メタデータ(データについての情報)
<article id="A001" author="山田太郎" date="2024-11-14">
<title>記事のタイトル</title>
<content>本文...</content>
</article>
- 短い識別情報
<product id="P001" sku="ABC-123">
- 列挙型の値
<item status="active" type="book" priority="high">
要素を使うべきケース
以下の場合は要素が適切:
- 構造化されたデータ
<person>
<name>
<first>太郎</first>
<last>山田</last>
</name>
</person>
- 複数行のテキスト
<article>
<content>
長い本文がここに入ります。
複数行にわたる場合は要素を使います。
</content>
</article>
- 繰り返しが必要なデータ
<person>
<phone>090-1234-5678</phone>
<phone>03-1234-5678</phone>
</person>
- 将来的に構造が複雑になる可能性
<!-- 今は単純だが将来複雑になるかも -->
<address>
<street>1-1-1</street>
<city>千代田区</city>
</address>
プログラミング言語での属性の扱い
各言語で属性をどう扱うか見ていきましょう。
Python
import xml.etree.ElementTree as ET
# XMLの読み込み
xml_text = '<product id="001" name="ノートPC" price="120000"/>'
root = ET.fromstring(xml_text)
# 属性の取得
product_id = root.get('id')
name = root.get('name')
price = root.get('price')
print(f'ID: {product_id}, 名前: {name}, 価格: {price}')
# 属性の設定
root.set('stock', '50')
# 全属性の取得
attributes = root.attrib
print(attributes) # {'id': '001', 'name': 'ノートPC', ...}
JavaScript
const xmlText = '<product id="001" name="ノートPC" price="120000"/>';
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(xmlText, "text/xml");
const product = xmlDoc.documentElement;
// 属性の取得
const id = product.getAttribute('id');
const name = product.getAttribute('name');
const price = product.getAttribute('price');
console.log(`ID: ${id}, 名前: ${name}, 価格: ${price}`);
// 属性の設定
product.setAttribute('stock', '50');
// 属性の有無を確認
const hasPrice = product.hasAttribute('price'); // true
// 属性の削除
product.removeAttribute('price');
Java
import org.w3c.dom.*;
import javax.xml.parsers.*;
Element product = ...; // XMLから取得した要素
// 属性の取得
String id = product.getAttribute("id");
String name = product.getAttribute("name");
// 属性の設定
product.setAttribute("stock", "50");
// 属性の有無を確認
boolean hasPrice = product.hasAttribute("price");
// 全属性の取得
NamedNodeMap attributes = product.getAttributes();
PHP
$xmlText = '<product id="001" name="ノートPC" price="120000"/>';
$xml = simplexml_load_string($xmlText);
// 属性の取得
$id = (string)$xml['id'];
$name = (string)$xml['name'];
$price = (string)$xml['price'];
echo "ID: $id, 名前: $name, 価格: $price";
// 属性の設定
$xml['stock'] = '50';
// 全属性の取得
$attributes = $xml->attributes();
foreach ($attributes as $key => $value) {
echo "$key = $value\n";
}
ベストプラクティス
属性を効果的に使うための推奨事項です。
1. 命名規則を統一する
推奨パターン:
<!-- ケバブケース(推奨) -->
<product product-id="001" created-date="2024-11-14">
<!-- キャメルケース -->
<product productId="001" createdDate="2024-11-14">
プロジェクト内で統一しましょう。
2. 属性値の型を明確にする
<!-- 数値 -->
<item quantity="10" price="2800.00">
<!-- 真偽値 -->
<feature enabled="true" visible="false">
<!-- 日付 -->
<event date="2024-11-14">
3. 必須属性と任意属性を区別する
XMLスキーマで定義:
<xs:attribute name="id" type="xs:string" use="required"/>
<xs:attribute name="description" type="xs:string" use="optional"/>
4. デフォルト値を設定する
<xs:attribute name="active" type="xs:boolean" default="true"/>
5. 属性の数を適度に保つ
良い例:
<product id="001" name="ノートPC" price="120000">
悪い例(属性が多すぎ):
<product id="001" name="ノートPC" price="120000"
category="electronics" brand="ABC"
color="silver" weight="1.5"
width="30" height="20" depth="2">
多すぎる場合は子要素を使いましょう。
よくある質問と回答
Q1. 属性と要素、どちらを優先すべき?
A. 基本的には要素を使い、メタデータや短い識別情報に属性を使うのが一般的です。迷ったら要素を選ぶ方が無難です。
Q2. 属性の順序に意味はある?
A. いいえ、XMLの仕様上、属性の順序に意味はありません。ただし、可読性のため統一した順序で書くことをおすすめします。
Q3. 属性値に改行を含められる?
A. 技術的には可能ですが、推奨されません。複数行のテキストは要素を使うべきです。
Q4. 属性はいくつまで設定できる?
A. 技術的な制限はありませんが、可読性のため5〜7個程度までが目安です。
Q5. 属性値を空にできる?
A. はい、可能です。
<element attribute="">
ただし、必須属性の場合は空にできません。
Q6. 同じ名前の属性を名前空間で区別できる?
A. はい、名前空間プレフィックスを使えば可能です。
<element app:id="001" db:id="123">
まとめ
XMLの属性についてまとめます。
属性の基本:
- 要素に追加情報を付与する仕組み
属性名="属性値"の形式- 引用符で囲む必要がある
標準属性:
xml:lang:言語指定xml:space:空白の扱いxml:id:一意な識別子xml:base:ベースURI
使い分けのポイント:
- メタデータ → 属性
- 構造化データ → 要素
- 短い識別情報 → 属性
- 複数行テキスト → 要素
ベストプラクティス:
- 命名規則を統一
- 属性の数を適度に保つ
- 型を明確にする
- デフォルト値を設定
属性を適切に使うことで、XMLがより読みやすく、処理しやすくなります。要素との使い分けを意識しながら、効果的に活用しましょう。
この記事が、あなたのXML活用の役に立てば嬉しいです!

コメント