「XMLを使って通信するって、どういうこと?」
「SOAPとかXML-RPCって聞いたことあるけど、何が違うの?」
インターネット上でデータをやり取りする際、XMLを使った通信プロトコルが広く使われています。WebサービスやAPIの世界では、XMLは長年にわたって重要な役割を果たしてきました。
この記事では、XMLを使った主要な通信プロトコルについて、基本から実践まで詳しく解説していきます。それぞれの特徴や使い分けを理解すれば、適切な技術選択ができるようになりますよ。
XMLと通信プロトコルの関係

まず、基本的な概念から説明しますね。
通信プロトコルとは
通信プロトコルとは、コンピューター同士がデータをやり取りする際の「約束事」のことです。
例えるなら:
- 言語の文法ルールのようなもの
- 「こういう形式でデータを送る」という取り決め
- 送信側と受信側が同じルールを理解している必要がある
なぜXMLを使うのか
XMLを通信に使う理由はいくつかあります。
主なメリット:
- 人間が読める:テキスト形式なのでデバッグしやすい
- 構造化データ:階層構造を表現できる
- 拡張性が高い:新しい要素を追加しやすい
- 標準化されている:多くのツールやライブラリがある
- プラットフォーム非依存:どんな環境でも扱える
ただし、最近ではJSONも人気が出てきています。
主要なXML通信プロトコル
XMLを使った代表的な通信プロトコルを見ていきましょう。
1. SOAP(Simple Object Access Protocol)
SOAPは、最も有名なXMLベースの通信プロトコルです。
特徴:
- W3C標準のプロトコル
- 厳密な仕様とルール
- エンタープライズ向け
- セキュリティ機能が充実
- 主にHTTP/HTTPSで通信
読み方:
- 「ソープ」と読みます
2. XML-RPC(XML Remote Procedure Call)
XML-RPCは、シンプルなリモート手続き呼び出しのプロトコルです。
特徴:
- SOAPより軽量でシンプル
- 学習コストが低い
- 古くから存在(1998年登場)
- 基本的な機能に特化
3. REST with XML
REST(Representational State Transfer)でXMLを使う方法です。
特徴:
- RESTの原則に従う
- HTTPメソッド(GET、POST、PUT、DELETE)を活用
- シンプルで分かりやすい
- JSONも使えるが、XMLも選択肢の一つ
4. WebDAV
WebDAV(Web Distributed Authoring and Versioning)は、ファイル管理のプロトコルです。
特徴:
- HTTPの拡張
- ファイルの読み書き、管理
- XMLで情報をやり取り
これらのプロトコルは、それぞれ異なる用途に適しています。
SOAP(Simple Object Access Protocol)詳細
SOAPについて詳しく見ていきましょう。
SOAPの基本構造
SOAPメッセージは、Envelope(封筒)という構造で包まれています。
基本的な構成:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<!-- ヘッダー情報(オプション) -->
</soap:Header>
<soap:Body>
<!-- 実際のデータ -->
</soap:Body>
</soap:Envelope>
各部分の役割:
- Envelope:メッセージ全体を包む
- Header:認証情報などのメタデータ(省略可能)
- Body:実際に送りたいデータ
SOAPリクエストの例
サーバーに「気温を教えて」とお願いする例です。
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:web="http://example.com/weather">
<soap:Header/>
<soap:Body>
<web:GetTemperature>
<web:City>Tokyo</web:City>
<web:Date>2024-11-14</web:Date>
</web:GetTemperature>
</soap:Body>
</soap:Envelope>
説明:
GetTemperature:呼び出したいメソッド名CityとDate:メソッドのパラメータ
SOAPレスポンスの例
サーバーからの返事です。
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:web="http://example.com/weather">
<soap:Header/>
<soap:Body>
<web:GetTemperatureResponse>
<web:Temperature>15.5</web:Temperature>
<web:Unit>Celsius</web:Unit>
</web:GetTemperatureResponse>
</soap:Body>
</soap:Envelope>
説明:
GetTemperatureResponse:レスポンスであることを示すTemperature:気温の値Unit:単位
SOAPエラーの表現
エラーが発生した場合は、Fault要素で表現します。
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>Invalid city name</faultstring>
<detail>
<error>The city 'Tokyoo' was not found</error>
</detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>
エラー情報:
faultcode:エラーの種類faultstring:エラーメッセージdetail:詳細情報
WSDL(Web Services Description Language)
SOAPと一緒に使われるのがWSDLです。
WSDLとは:
- Webサービスの「取扱説明書」
- どんなメソッドがあるか
- どんなパラメータが必要か
- どんなレスポンスが返るか
簡単なWSDLの例:
<?xml version="1.0" encoding="UTF-8"?>
<definitions
name="WeatherService"
targetNamespace="http://example.com/weather"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<message name="GetTemperatureRequest">
<part name="city" type="xsd:string"/>
<part name="date" type="xsd:date"/>
</message>
<message name="GetTemperatureResponse">
<part name="temperature" type="xsd:float"/>
<part name="unit" type="xsd:string"/>
</message>
<portType name="WeatherPortType">
<operation name="GetTemperature">
<input message="GetTemperatureRequest"/>
<output message="GetTemperatureResponse"/>
</operation>
</portType>
<!-- 省略 -->
</definitions>
WSDLがあれば、クライアントは自動的に通信コードを生成できます。
XML-RPC詳細
XML-RPCについて見ていきましょう。
XML-RPCの基本構造
SOAPよりシンプルです。
リクエストの形式:
<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>メソッド名</methodName>
<params>
<param>
<value>パラメータ1</value>
</param>
<param>
<value>パラメータ2</value>
</param>
</params>
</methodCall>
XML-RPCリクエストの例
数値を足し算するメソッドを呼び出す例です。
<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>math.add</methodName>
<params>
<param>
<value><int>5</int></value>
</param>
<param>
<value><int>3</int></value>
</param>
</params>
</methodCall>
説明:
methodName:math.addというメソッドを呼び出す- 2つのパラメータ:5と3
XML-RPCレスポンスの例
サーバーからの返事です。
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
<param>
<value><int>8</int></value>
</param>
</params>
</methodResponse>
説明:
- 計算結果の8が返ってくる
XML-RPCのデータ型
XML-RPCでサポートされているデータ型です。
基本的なデータ型:
<!-- 整数 -->
<value><int>42</int></value>
<value><i4>42</i4></value>
<!-- 小数 -->
<value><double>3.14</double></value>
<!-- 文字列 -->
<value><string>Hello</string></value>
<value>Hello</value> <!-- stringタグは省略可 -->
<!-- 真偽値 -->
<value><boolean>1</boolean></value> <!-- true -->
<value><boolean>0</boolean></value> <!-- false -->
<!-- 日時 -->
<value><dateTime.iso8601>20241114T12:00:00</dateTime.iso8601></value>
<!-- Base64エンコードされたバイナリ -->
<value><base64>SGVsbG8gV29ybGQ=</base64></value>
構造化データ:
<!-- 配列 -->
<value>
<array>
<data>
<value><int>1</int></value>
<value><int>2</int></value>
<value><int>3</int></value>
</data>
</array>
</value>
<!-- 構造体(連想配列) -->
<value>
<struct>
<member>
<name>name</name>
<value><string>山田太郎</string></value>
</member>
<member>
<name>age</name>
<value><int>30</int></value>
</member>
</struct>
</value>
REST with XML
RESTアーキテクチャでXMLを使う方法です。
RESTの基本原則
RESTは、アーキテクチャスタイルの一つです。
主な原則:
- リソース指向(URLでリソースを表現)
- HTTPメソッドを適切に使用
- ステートレス(状態を保持しない)
- キャッシュ可能
RESTでのHTTPメソッドの使い分け
標準的な使い方:
- GET:データの取得
- POST:データの作成
- PUT:データの更新(置き換え)
- PATCH:データの部分更新
- DELETE:データの削除
REST with XMLの例
ユーザー情報を扱うAPIの例です。
ユーザー一覧の取得(GET):
リクエスト:
GET /api/users HTTP/1.1
Host: example.com
Accept: application/xml
レスポンス:
HTTP/1.1 200 OK
Content-Type: application/xml
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="1">
<name>山田太郎</name>
<email>yamada@example.com</email>
</user>
<user id="2">
<name>佐藤花子</name>
<email>sato@example.com</email>
</user>
</users>
特定ユーザーの取得(GET):
リクエスト:
GET /api/users/1 HTTP/1.1
Host: example.com
Accept: application/xml
レスポンス:
HTTP/1.1 200 OK
Content-Type: application/xml
<?xml version="1.0" encoding="UTF-8"?>
<user id="1">
<name>山田太郎</name>
<email>yamada@example.com</email>
<created_at>2024-01-15T10:30:00Z</created_at>
</user>
新規ユーザーの作成(POST):
リクエスト:
POST /api/users HTTP/1.1
Host: example.com
Content-Type: application/xml
<?xml version="1.0" encoding="UTF-8"?>
<user>
<name>鈴木一郎</name>
<email>suzuki@example.com</email>
</user>
レスポンス:
HTTP/1.1 201 Created
Content-Type: application/xml
Location: /api/users/3
<?xml version="1.0" encoding="UTF-8"?>
<user id="3">
<name>鈴木一郎</name>
<email>suzuki@example.com</email>
<created_at>2024-11-14T12:00:00Z</created_at>
</user>
ユーザー情報の更新(PUT):
リクエスト:
PUT /api/users/1 HTTP/1.1
Host: example.com
Content-Type: application/xml
<?xml version="1.0" encoding="UTF-8"?>
<user>
<name>山田太郎</name>
<email>new.yamada@example.com</email>
</user>
レスポンス:
HTTP/1.1 200 OK
Content-Type: application/xml
<?xml version="1.0" encoding="UTF-8"?>
<user id="1">
<name>山田太郎</name>
<email>new.yamada@example.com</email>
<updated_at>2024-11-14T12:05:00Z</updated_at>
</user>
ユーザーの削除(DELETE):
リクエスト:
DELETE /api/users/1 HTTP/1.1
Host: example.com
レスポンス:
HTTP/1.1 204 No Content
RESTのエラー表現
HTTPステータスコードとXMLでエラーを表現します。
HTTP/1.1 404 Not Found
Content-Type: application/xml
<?xml version="1.0" encoding="UTF-8"?>
<error>
<code>404</code>
<message>User not found</message>
<detail>The user with ID 999 does not exist</detail>
</error>
プログラミング言語での実装例

各言語での実装方法を見ていきましょう。
Python(SOAPクライアント)
zeepライブラリを使用:
from zeep import Client
# WSDLのURL
wsdl_url = 'http://example.com/weather?wsdl'
# クライアントを作成
client = Client(wsdl=wsdl_url)
# メソッドを呼び出し
result = client.service.GetTemperature(
City='Tokyo',
Date='2024-11-14'
)
print(f'気温: {result.Temperature}度')
Python(XML-RPCクライアント)
標準ライブラリを使用:
import xmlrpc.client
# サーバーに接続
server = xmlrpc.client.ServerProxy('http://example.com/xmlrpc')
# メソッドを呼び出し
result = server.math.add(5, 3)
print(f'結果: {result}') # 8
Python(REST with XML)
requestsライブラリを使用:
import requests
import xml.etree.ElementTree as ET
# GETリクエスト
response = requests.get(
'http://example.com/api/users/1',
headers={'Accept': 'application/xml'}
)
# XMLをパース
root = ET.fromstring(response.content)
name = root.find('name').text
print(f'名前: {name}')
# POSTリクエスト
xml_data = '''
<?xml version="1.0" encoding="UTF-8"?>
<user>
<name>鈴木一郎</name>
<email>suzuki@example.com</email>
</user>
'''
response = requests.post(
'http://example.com/api/users',
data=xml_data,
headers={'Content-Type': 'application/xml'}
)
print(f'ステータスコード: {response.status_code}')
JavaScript(SOAPクライアント)
soapライブラリを使用:
const soap = require('soap');
const url = 'http://example.com/weather?wsdl';
soap.createClient(url, function(err, client) {
if (err) {
console.error(err);
return;
}
// メソッドを呼び出し
client.GetTemperature({
City: 'Tokyo',
Date: '2024-11-14'
}, function(err, result) {
if (err) {
console.error(err);
return;
}
console.log('気温:', result.Temperature + '度');
});
});
PHP(SOAPクライアント)
標準のSoapClientを使用:
<?php
// WSDLのURL
$wsdl = 'http://example.com/weather?wsdl';
// SOAPクライアントを作成
$client = new SoapClient($wsdl);
// メソッドを呼び出し
$result = $client->GetTemperature([
'City' => 'Tokyo',
'Date' => '2024-11-14'
]);
echo '気温: ' . $result->Temperature . '度';
?>
Java(REST with XML)
HttpClientとJAXBを使用:
import java.net.http.*;
import java.net.URI;
public class RestClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
// GETリクエスト
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://example.com/api/users/1"))
.header("Accept", "application/xml")
.GET()
.build();
HttpResponse<String> response = client.send(
request,
HttpResponse.BodyHandlers.ofString()
);
System.out.println("レスポンス: " + response.body());
}
}
各プロトコルの比較と使い分け
どのプロトコルを選ぶべきか、比較してみましょう。
比較表
| 項目 | SOAP | XML-RPC | REST with XML |
|---|---|---|---|
| 複雑さ | 高い | 低い | 中程度 |
| 学習コスト | 高い | 低い | 中程度 |
| セキュリティ | WS-Securityで充実 | 基本的 | HTTPSで対応 |
| パフォーマンス | やや遅い | 普通 | 速い |
| 拡張性 | 非常に高い | 限定的 | 高い |
| ツールサポート | 豊富 | 少ない | 豊富 |
| 主な用途 | エンタープライズ | 簡易RPC | Web API |
SOAPを選ぶべき場合
適している状況:
- 金融システムなど、セキュリティが重要
- トランザクション管理が必要
- 複雑なビジネスロジック
- WS-*標準(WS-Security、WS-ReliableMessagingなど)が必要
- エンタープライズ環境
例:
- 銀行の決済システム
- 企業間のデータ交換
- レガシーシステムとの統合
XML-RPCを選ぶべき場合
適している状況:
- シンプルなリモート手続き呼び出し
- 小規模なシステム
- 学習コストを抑えたい
- 古いシステムとの互換性
例:
- ブログのトラックバック
- 簡易的な管理ツール
- プロトタイピング
REST with XMLを選ぶべき場合
適している状況:
- Web API
- リソース指向の設計
- シンプルで分かりやすいインターフェース
- パフォーマンスを重視
- JSONとXMLの両方をサポートしたい
例:
- モバイルアプリのバックエンド
- Webサービスの公開API
- マイクロサービス間の通信
セキュリティの考慮事項
XML通信のセキュリティについて見ていきましょう。
基本的なセキュリティ対策
必須の対策:
- HTTPSの使用
- 通信の暗号化
- 盗聴の防止
- 認証・認可
- APIキー
- OAuth 2.0
- JWT(JSON Web Token)
- 入力検証
- XMLインジェクション対策
- パラメータのバリデーション
XML固有のセキュリティリスク
XXE(XML External Entity)攻撃:
<!-- 悪意のあるXML -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<data>&xxe;</data>
対策:
- 外部エンティティの無効化
- DTDの処理を無効化
Python での対策例:
import xml.etree.ElementTree as ET
# 安全でない方法
# root = ET.fromstring(xml_data)
# 安全な方法
import defusedxml.ElementTree as DET
root = DET.fromstring(xml_data)
SOAP WS-Security
SOAPでは、WS-Securityという標準があります。
提供される機能:
- メッセージの署名
- メッセージの暗号化
- タイムスタンプ
- ユーザー名トークン
例:
<soap:Header>
<wsse:Security>
<wsse:UsernameToken>
<wsse:Username>user</wsse:Username>
<wsse:Password Type="...">password</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soap:Header>
JSONとの比較
最近はJSONも人気です。XMLとの違いを見てみましょう。
XMLの利点
XMLが優れている点:
- 属性とコメントが使える
- 名前空間で衝突を回避
- スキーマ検証が強力(XSD)
- 複雑な文書構造に適している
- XSLTで変換が可能
XMLの例:
<book isbn="978-4-1234-5678-9" language="ja">
<!-- 日本語の本 -->
<title>XMLの教科書</title>
<author>山田太郎</author>
<price currency="JPY">2800</price>
</book>
JSONの利点
JSONが優れている点:
- よりシンプルで軽量
- JavaScriptとの親和性が高い
- 人間が読みやすい
- パースが高速
JSONの例:
{
"book": {
"isbn": "978-4-1234-5678-9",
"language": "ja",
"title": "XMLの教科書",
"author": "山田太郎",
"price": {
"amount": 2800,
"currency": "JPY"
}
}
}
使い分けの目安
XMLを選ぶべき:
- レガシーシステムとの統合
- 複雑な文書構造
- 厳密なバリデーションが必要
- 企業間のデータ交換
JSONを選ぶべき:
- Webアプリケーション
- モバイルアプリ
- シンプルなデータ構造
- パフォーマンス重視
よくある質問と回答
Q1. SOAPとRESTはどちらが良い?
A. 用途によります。エンタープライズシステムで厳密な仕様が必要ならSOAP、Web APIで柔軟性とシンプルさを求めるならRESTが適しています。最近のトレンドはRESTですが、SOAPが必要な場面もまだまだあります。
Q2. XMLは古い技術?
A. 古くからある技術ですが、今でも多くの場面で使われています。特に企業システムやWebサービスの世界では現役です。ただし、新規プロジェクトではJSONを選択することも多くなっています。
Q3. WSDLは必須?
A. SOAPを使う場合、WSDLがあると便利ですが必須ではありません。ただし、WSDLがあるとクライアントコードの自動生成ができるため、開発効率が上がります。
Q4. HTTPSは必須?
A. セキュリティの観点から、本番環境では必ずHTTPSを使用すべきです。特に認証情報や個人情報を扱う場合は必須です。
Q5. XML-RPCは今でも使われている?
A. 使用率は減っていますが、一部のシステムやツールでは今でも使われています。新規プロジェクトではSOAPかRESTを選択することが多いです。
Q6. SOAPは遅いって本当?
A. RESTやJSON-RPCと比べると、オーバーヘッドがあるため若干遅くなる傾向があります。ただし、適切に設計すれば実用上問題ないレベルです。
まとめ
XMLを使った通信プロトコルについてまとめます。
主要なプロトコル:
- SOAP:エンタープライズ向け、セキュリティ充実、複雑
- XML-RPC:シンプルなRPC、学習コスト低い、機能は基本的
- REST with XML:リソース指向、HTTPメソッド活用、柔軟
選択の目安:
- エンタープライズシステム → SOAP
- シンプルなRPC → XML-RPC
- Web API → REST(XMLまたはJSON)
セキュリティ:
- 必ずHTTPSを使用
- 入力検証を徹底
- XXE攻撃に注意
- 認証・認可の実装
現代のトレンド:
- RESTが主流
- JSONも人気
- SOAPは特定用途で使用
- GraphQLなど新しい選択肢も
XMLベースの通信プロトコルは、それぞれ特徴があります。プロジェクトの要件に応じて、適切なプロトコルを選択することが大切です。
この記事が、あなたのシステム開発の役に立てば嬉しいです。適切な技術選択で、より良いシステムを作っていきましょう!

コメント