XMLタグのコロン(:)とは?名前空間を分かりやすく解説

XMLファイルを見ていると、<xsl:template><soap:Envelope>のように、コロン(:)が入ったタグを見かけることがありますよね。

「このコロンは何の意味があるの?」「自分でも使えるの?」と疑問に思った方も多いはずです。

実は、このコロンはXMLの名前空間(ネームスペース)という仕組みを表しているんです。少し難しく聞こえるかもしれませんが、理解すれば「なるほど、便利な仕組みだな」と納得できますよ。

この記事では、XMLタグのコロンが何を意味するのか、名前空間とは何か、そしてどうやって使うのかを、初心者の方にも分かりやすく解説していきます!


スポンサーリンク
  1. XMLタグのコロンは何を表すのか
    1. コロンの前後の意味
    2. なぜこんな仕組みが必要なのか
  2. 名前空間(ネームスペース)とは
    1. 名前空間の定義
    2. 名前空間URI
    3. 名前空間の宣言
  3. コロン付きタグの具体例
    1. 例1:XSLT(XML変換)
    2. 例2:SOAP(Webサービス)
    3. 例3:RSS(フィード配信)
    4. 例4:SVG(ベクター画像)
  4. デフォルト名前空間とは
    1. デフォルト名前空間の宣言
    2. デフォルトと明示的プレフィックスの混在
  5. 名前空間の宣言場所とスコープ
    1. ルート要素で宣言
    2. 途中の要素で宣言
    3. 同じプレフィックスの再定義
  6. プレフィックスの選び方
    1. よく使われるプレフィックス
    2. 独自プレフィックスの命名規則
  7. 属性にも名前空間が使える
    1. 属性への名前空間適用
    2. XSI(XMLスキーマインスタンス)の例
  8. コロンなしでも名前空間は効いている
    1. HTMLの例
    2. SVGの例
  9. よくある間違いとトラブルシューティング
    1. 間違い1:名前空間を宣言せずに使う
    2. 間違い2:コロンだけを装飾として使う
    3. 間違い3:プレフィックスだけ合わせて、URIが違う
    4. 間違い4:名前空間URIをhttp://にしたのにアクセスできない
  10. プログラムでの名前空間の扱い
    1. Pythonでの例
    2. JavaScriptでの例
    3. Javaでの例
  11. XMLスキーマと名前空間
    1. ターゲット名前空間
    2. スキーマに基づくXML文書
  12. よくある質問(FAQ)
    1. Q1: コロンは必須ですか?
    2. Q2: プレフィックスは何でもいいですか?
    3. Q3: 名前空間URIは実在するURLでなければいけませんか?
    4. Q4: コロンを複数使えますか(例:a:b:c)?
    5. Q5: HTMLとXHTMLで名前空間の扱いは違いますか?
    6. Q6: 名前空間を使わないとどうなりますか?
  13. まとめ:XMLタグのコロンは名前空間を表す

XMLタグのコロンは何を表すのか

結論から言うと、XMLタグのコロン(:)は名前空間プレフィックスを示しています。

コロンの前後の意味

<xsl:template>

このタグを分解すると:

  • xsl:名前空間プレフィックス(どのグループに属するか)
  • ::区切り記号
  • template:ローカル名(要素の実際の名前)

つまり、「xslグループに属するtemplate要素」という意味になるんです。

なぜこんな仕組みが必要なのか

例えば、以下のような状況を考えてみましょう。

Aさんが作ったXML:

<table>
  <tr>
    <td>データ</td>
  </tr>
</table>

Bさんが作ったXML:

<table>
  <name>会議用テーブル</name>
  <price>50000円</price>
</table>

どちらも<table>という同じタグ名を使っていますが、意味が全く違います。AさんはHTML風の表、Bさんは家具のテーブルを表現しているんですね。

この2つのXMLを1つのファイルに混在させたい時、どうやって区別すればいいでしょうか?

ここで名前空間が活躍します!

<html:table>
  <html:tr>
    <html:td>データ</html:td>
  </html:tr>
</html:table>

<furniture:table>
  <furniture:name>会議用テーブル</furniture:name>
  <furniture:price>50000円</furniture:price>
</furniture:table>

コロンを使って区別することで、同じ名前のタグでも衝突しないようにできるわけです。


名前空間(ネームスペース)とは

コロンを理解するには、名前空間(namespace)の概念を知る必要があります。

名前空間の定義

名前空間とは、XMLの要素や属性に一意の識別子を与えるための仕組みです。

簡単に言うと、「このタグはどのグループに属しているか」を示す目印のようなものですね。

名前空間URI

名前空間は、URI(Uniform Resource Identifier)で識別します。

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

この例では:

  • xmlns:XML NameSpace(名前空間宣言)の略
  • xsl:プレフィックス(省略名)
  • http://www.w3.org/1999/XSL/Transform:名前空間URI

URIは「http://」で始まることが多いですが、実際にアクセスできるウェブページである必要はありません。ただの識別子として使われているんです。

名前空間の宣言

名前空間を使うには、まず宣言が必要です。

<root xmlns:html="http://www.w3.org/1999/xhtml"
      xmlns:furniture="http://example.com/furniture">

  <html:table>
    <html:tr>
      <html:td>データ</html:td>
    </html:tr>
  </html:table>

  <furniture:table>
    <furniture:name>会議用テーブル</furniture:name>
  </furniture:table>

</root>

ルート要素にxmlns:プレフィックス="URI"という形で宣言しておけば、その子孫要素すべてで使えるようになります。


コロン付きタグの具体例

実際にどんな場面でコロン付きタグが使われているか見てみましょう。

例1:XSLT(XML変換)

XSLTは、XMLを別の形式に変換するための言語です。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/">
    <html>
      <body>
        <xsl:apply-templates/>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="title">
    <h1><xsl:value-of select="."/></h1>
  </xsl:template>

</xsl:stylesheet>

xsl:プレフィックスが付いたタグは、すべてXSLTの命令です。

例2:SOAP(Webサービス)

SOAPは、Webサービスでデータをやり取りする際のプロトコルです。

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

  <soap:Header>
    <auth:Authentication xmlns:auth="http://example.com/auth">
      <auth:Username>user123</auth:Username>
      <auth:Password>pass456</auth:Password>
    </auth:Authentication>
  </soap:Header>

  <soap:Body>
    <m:GetStockPrice xmlns:m="http://example.com/stock">
      <m:StockName>IBM</m:StockName>
    </m:GetStockPrice>
  </soap:Body>

</soap:Envelope>

複数の名前空間が混在していますが、コロンのおかげで区別できています。

例3:RSS(フィード配信)

RSSは、ブログの更新情報などを配信するフォーマットです。

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" 
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:content="http://purl.org/rss/1.0/modules/content/">

  <channel>
    <title>ブログタイトル</title>

    <item>
      <title>記事タイトル</title>
      <dc:creator>著者名</dc:creator>
      <content:encoded><![CDATA[記事の本文]]></content:encoded>
    </item>

  </channel>
</rss>

RSS標準の要素に加えて、Dublin Core(dc:)やContent(content:)という拡張モジュールを使っています。

例4:SVG(ベクター画像)

SVGを別のXML文書に埋め込む時も、名前空間が使われます。

<?xml version="1.0" encoding="UTF-8"?>
<document xmlns:svg="http://www.w3.org/2000/svg">

  <title>図形を含む文書</title>

  <svg:svg width="100" height="100">
    <svg:circle cx="50" cy="50" r="40" fill="red"/>
  </svg:svg>

</document>

デフォルト名前空間とは

実は、プレフィックス(コロン)を使わない方法もあります。

デフォルト名前空間の宣言

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>ページタイトル</title>
  </head>
  <body>
    <p>本文</p>
  </body>
</html>

この例では、xmlns="URI"という形で宣言しています(プレフィックスなし)。

こうすると、プレフィックスが付いていない要素すべてが、この名前空間に属することになるんです。

デフォルトと明示的プレフィックスの混在

<root xmlns="http://example.com/default"
      xmlns:special="http://example.com/special">

  <!-- デフォルト名前空間 -->
  <item>普通のアイテム</item>

  <!-- 明示的プレフィックス -->
  <special:item>特別なアイテム</special:item>

</root>

デフォルト名前空間を使えば、すっきりしたXMLが書けますね。


名前空間の宣言場所とスコープ

名前空間は、宣言した要素とその子孫要素で有効になります。

ルート要素で宣言

最も一般的なパターンです。

<root xmlns:ex="http://example.com">
  <ex:item>
    <ex:name>商品名</ex:name>
    <ex:price>1000円</ex:price>
  </ex:item>
</root>

ルート要素で宣言すれば、ファイル全体で使えます。

途中の要素で宣言

必要な場所だけで宣言することもできます。

<root>
  <section1>
    <item>普通のアイテム</item>
  </section1>

  <section2 xmlns:special="http://example.com/special">
    <special:item>特別なアイテム</special:item>
  </section2>

  <section3>
    <!-- ここではspecial:は使えない -->
    <item>別のアイテム</item>
  </section3>
</root>

section2とその子孫でのみ、special:プレフィックスが使えます。

同じプレフィックスの再定義

技術的には可能ですが、混乱の元なので推奨されません

<root xmlns:ex="http://example.com/v1">
  <ex:item>バージョン1</ex:item>

  <section xmlns:ex="http://example.com/v2">
    <!-- この中では ex: は別の名前空間を指す -->
    <ex:item>バージョン2</ex:item>
  </section>

</root>

プレフィックスの選び方

プレフィックスは自由に決められますが、慣習があります。

よく使われるプレフィックス

プレフィックス名前空間用途
xslhttp://www.w3.org/1999/XSL/TransformXSLT変換
soaphttp://schemas.xmlsoap.org/soap/envelope/SOAPメッセージ
xsd または xshttp://www.w3.org/2001/XMLSchemaXMLスキーマ定義
xsihttp://www.w3.org/2001/XMLSchema-instanceスキーマインスタンス
dchttp://purl.org/dc/elements/1.1/Dublin Coreメタデータ
rdfhttp://www.w3.org/1999/02/22-rdf-syntax-ns#RDF
svghttp://www.w3.org/2000/svgSVG画像

独自プレフィックスの命名規則

自分でプレフィックスを作る場合:

短く、分かりやすく

xmlns:product="http://example.com/products"
xmlns:order="http://example.com/orders"

一般的な略語を避ける

<!-- 良い例 -->
xmlns:myapp="http://example.com/myapp"

<!-- 悪い例(html, xmlなど一般的な略語と紛らわしい) -->
xmlns:html="http://example.com/myapp"

意味のある名前

<!-- 良い例 -->
xmlns:customer="http://example.com/customer"

<!-- 悪い例(意味不明) -->
xmlns:abc="http://example.com/customer"

属性にも名前空間が使える

要素だけでなく、属性にも名前空間を使えます。

属性への名前空間適用

<document xmlns:meta="http://example.com/metadata">
  <item meta:author="田中太郎"
        meta:created="2025-01-15"
        meta:version="1.0">
    <title>ドキュメントタイトル</title>
  </item>
</document>

属性にもプレフィックスを付けることで、カスタム属性と標準属性を区別できます。

XSI(XMLスキーマインスタンス)の例

実用的な例として、スキーマ検証でよく使われるxsi:typeがあります。

<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <value xsi:type="xs:string">テキスト</value>
  <value xsi:type="xs:integer">123</value>

</data>

コロンなしでも名前空間は効いている

HTMLやSVGなど、コロンがなくても名前空間が適用されているケースもあります。

HTMLの例

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>ページタイトル</title>
  </head>
  <body>
    <p>本文</p>
  </body>
</html>

すべての要素が、XHTMLの名前空間に属しています。コロンがないのは、デフォルト名前空間だからです。

SVGの例

<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
  <circle cx="50" cy="50" r="40" fill="blue"/>
</svg>

SVG要素も、名前空間に属していますが、プレフィックスは不要です。


よくある間違いとトラブルシューティング

初心者がつまずきやすいポイントを解説します。

間違い1:名前空間を宣言せずに使う

悪い例:

<root>
  <xsl:template match="/">
    <!-- エラー:xsl: が宣言されていない -->
  </xsl:template>
</root>

良い例:

<root xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <!-- OK -->
  </xsl:template>
</root>

間違い2:コロンだけを装飾として使う

悪い例:

<root>
  <my:element>内容</my:element>
  <!-- 名前空間の宣言がないので、実は名前空間ではなくエラー -->
</root>

コロンは名前空間の仕組みなので、装飾として勝手に使うことはできません

間違い3:プレフィックスだけ合わせて、URIが違う

<!-- ファイル1 -->
<root xmlns:ex="http://example.com/v1">
  <ex:item>アイテム1</ex:item>
</root>

<!-- ファイル2 -->
<root xmlns:ex="http://example.com/v2">
  <ex:item>アイテム2</ex:item>
</root>

プレフィックスが同じex:でも、URIが違えば別の名前空間です。パーサーはURIを見て判断します。

間違い4:名前空間URIをhttp://にしたのにアクセスできない

これは間違いではありません!

名前空間URIは、単なる識別子です。実際にアクセスできるURLである必要はないんです。

xmlns:myapp="http://example.com/myapp/v1"

このURIにブラウザでアクセスしても、何も表示されなくて構いません。


プログラムでの名前空間の扱い

開発者向けに、各言語での名前空間の扱い方を紹介します。

Pythonでの例

import xml.etree.ElementTree as ET

# 名前空間付きXMLをパース
xml_string = '''
<root xmlns:ex="http://example.com">
  <ex:item>値1</ex:item>
  <ex:item>値2</ex:item>
</root>
'''

root = ET.fromstring(xml_string)

# 名前空間を辞書で定義
namespaces = {'ex': 'http://example.com'}

# 名前空間を指定して要素を検索
items = root.findall('ex:item', namespaces)
for item in items:
    print(item.text)

# 出力: 値1, 値2

JavaScriptでの例

const parser = new DOMParser();
const xmlString = `
<root xmlns:ex="http://example.com">
  <ex:item>値1</ex:item>
  <ex:item>値2</ex:item>
</root>
`;

const xmlDoc = parser.parseFromString(xmlString, "text/xml");

// 名前空間URIを指定して要素を取得
const items = xmlDoc.getElementsByTagNameNS(
  'http://example.com',  // 名前空間URI
  'item'                 // ローカル名
);

for (let item of items) {
  console.log(item.textContent);
}
// 出力: 値1, 値2

Javaでの例

import javax.xml.parsers.*;
import org.w3c.dom.*;

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);  // 名前空間を認識

DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse("sample.xml");

// 名前空間URIとローカル名で要素を取得
NodeList items = doc.getElementsByTagNameNS(
    "http://example.com",  // 名前空間URI
    "item"                 // ローカル名
);

for (int i = 0; i < items.getLength(); i++) {
    Element item = (Element) items.item(i);
    System.out.println(item.getTextContent());
}

XMLスキーマと名前空間

XMLスキーマ(XSD)でも、名前空間は重要な役割を果たします。

ターゲット名前空間

スキーマファイル自体に、定義する要素の名前空間を指定できます。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://example.com/products"
           xmlns:prod="http://example.com/products"
           elementFormDefault="qualified">

  <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:complexType>
  </xs:element>

</xs:schema>

スキーマに基づくXML文書

<?xml version="1.0" encoding="UTF-8"?>
<prod:product xmlns:prod="http://example.com/products"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://example.com/products product.xsd">

  <prod:name>商品名</prod:name>
  <prod:price>1000</prod:price>

</prod:product>

よくある質問(FAQ)

Q1: コロンは必須ですか?

A: いいえ。デフォルト名前空間を使えば、コロンなしでも名前空間を適用できます。ただし、複数の名前空間を混在させる場合は、コロンで区別する方が分かりやすいです。

Q2: プレフィックスは何でもいいですか?

A: はい、技術的には自由です。ただし、慣習的なプレフィックス(xsl、soap、svgなど)がある場合は、それに従う方が理解しやすくなります。

Q3: 名前空間URIは実在するURLでなければいけませんか?

A: いいえ。名前空間URIは単なる識別子なので、実際にアクセスできる必要はありません。

Q4: コロンを複数使えますか(例:a:b:c)?

A: いいえ。XMLの仕様では、要素名や属性名にコロンは1つだけ使えます。複数のコロンは許可されていません。

Q5: HTMLとXHTMLで名前空間の扱いは違いますか?

A: はい。HTML5では名前空間の記述は任意ですが、XHTML(XMLとして処理されるHTML)では、名前空間を明示的に宣言することが推奨されます。

Q6: 名前空間を使わないとどうなりますか?

A: 小規模なXMLファイルなら問題ありません。しかし、複数のXML語彙を組み合わせる場合や、ライブラリ・ツールで処理する場合は、名前空間を使わないと要素名の衝突が起きる可能性があります。


まとめ:XMLタグのコロンは名前空間を表す

XMLタグのコロンと名前空間について、重要なポイントをまとめます。

コロンの意味:

  • 名前空間プレフィックスとローカル名を区切る記号
  • 形式:プレフィックス:ローカル名
  • 例:<xsl:template>は「xsl名前空間のtemplate要素」

名前空間の役割:

  • 要素名や属性名の衝突を防ぐ
  • 異なるXML語彙を一つの文書に混在させる
  • URIで一意に識別する

名前空間の宣言:

  • 形式:xmlns:プレフィックス="URI"
  • デフォルト名前空間:xmlns="URI"
  • 宣言した要素とその子孫で有効

よく使われる名前空間:

  • XSLT:xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  • SOAP:xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
  • SVG:xmlns:svg="http://www.w3.org/2000/svg"
  • XMLスキーマ:xmlns:xs="http://www.w3.org/2001/XMLSchema"

注意点:

  • プレフィックスを使う前に必ず宣言する
  • 名前空間URIは識別子(実在のURLでなくてOK)
  • 重要なのはプレフィックスではなくURI
  • コロンを装飾として勝手に使わない

デフォルト名前空間:

  • xmlns="URI"で宣言
  • プレフィックスなしの要素に適用
  • HTML、SVGなどでよく使われる

XMLのコロンは、ただの装飾ではなく、名前空間という重要な仕組みを支えています。最初は複雑に見えるかもしれませんが、「異なるグループの要素を区別する目印」と理解すれば、その便利さが分かるはずです。

XSLT、SOAP、RSSなど、実際のXML文書を見ながら、名前空間の使い方に慣れていきましょう!


関連キーワード: XML、名前空間、ネームスペース、プレフィックス、コロン、URI、xmlns、XSLT、SOAP、SVG、RSS、スキーマ、XSD、XHTML、要素名、衝突回避

コメント

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