【PHP8.x】C14Nメソッドの使い方

C14Nメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

DOMCharacterData::C14Nメソッドは、ドキュメントを正規化されたXML形式で出力するメソッドです。具体的には、XMLドキュメントの部分木を、W3CのCanonical XML Version 1.1勧告に従ってシリアライズ(直列化)します。このメソッドを使用することで、XMLドキュメントを異なるシステム間で一貫性のある形式で共有したり、デジタル署名などのセキュリティ関連の処理を行う際に、ドキュメントの構造が変更されることによる問題を回避したりできます。

このメソッドは、DOMCharacterDataクラスに属しており、CharacterDataノード(例えば、テキストノードやコメントノード)から呼び出すことができます。CharacterDataノードから呼び出された場合、そのノード自体ではなく、そのノードを含むドキュメント全体が正規化されます。

C14Nメソッドは、オプションでいくつかのパラメータを受け取ることができ、これによって正規化の挙動を細かく制御できます。例えば、コメントを含めるかどうか、属性の順序を保持するかどうか、空白文字の処理方法などを指定できます。これらのオプションを使用することで、特定のニーズに合わせた正規化を行うことが可能になります。

正規化されたXMLは、文字列として返されます。エラーが発生した場合は、FALSEを返します。このメソッドは、XMLドキュメントの構造や内容をプログラムで操作し、他のシステムとの連携やデータ交換を行う場合に非常に有用です。システムエンジニアは、このメソッドを理解し、適切に使用することで、XMLベースのアプリケーションの信頼性と互換性を高めることができます。

構文(syntax)

1DOMCharacterData::C14N(bool $exclusive = false, bool $withComments = false, ?array $nodes = null, ?string $namespacePrefix = null) : string|false

引数(parameters)

bool $exclusive = false, bool $withComments = false, ?array $xpath = null, ?array $nsPrefixes = null

  • bool $exclusive = false: 排他的な正規化を行うかどうかを指定します。trueの場合、親ノードではなく、自身の子ノードのみが正規化されます。
  • bool $withComments = false: コメントノードを正規化に含めるかどうかを指定します。trueの場合、コメントノードも正規化されます。
  • ?array $xpath = null: 正規化の対象とするノードをXPath式で指定します。指定しない場合は、DOMCharacterDataノード全体が対象となります。
  • ?array $nsPrefixes = null: 名前空間のプレフィックスを配列で指定します。指定されたプレフィックスを持つ名前空間のみが正規化の対象となります。

戻り値(return)

string|bool

このメソッドは、指定されたノードとその子孫を正規化(canonicalize)した結果を文字列として返します。正規化に失敗した場合はfalseを返します。

サンプルコード

PHP DOMCharacterData::C14NでXMLを正規化する

1<?php
2
3/**
4 * DOMCharacterData::C14N() のサンプルコード
5 *
6 * XML ドキュメントのノードを正規化された XML 形式で出力します。
7 */
8function generateC14N(DOMDocument $dom, bool $exclusive = false, bool $withComments = false, ?array $xpath = null, ?array $nsPrefixes = null): string|bool
9{
10    // 正規化された XML を取得
11    $canonicalXml = $dom->documentElement->C14N($exclusive, $withComments, $xpath, $nsPrefixes);
12
13    // 結果を返す
14    return $canonicalXml;
15}
16
17// DOMDocument の作成とデータの追加
18$dom = new DOMDocument('1.0', 'UTF-8');
19$root = $dom->createElement('root');
20$dom->appendChild($root);
21$comment = $dom->createComment('This is a comment.');
22$root->appendChild($comment);
23$text = $dom->createTextNode('Hello, World!');
24$root->appendChild($text);
25
26// C14N を実行して結果を表示
27$canonicalXml = generateC14N($dom, false, true);
28
29if ($canonicalXml !== false) {
30    echo $canonicalXml . PHP_EOL;
31} else {
32    echo "C14N failed." . PHP_EOL;
33}
34
35?>

このサンプルコードは、PHPのDOMCharacterDataクラスのC14Nメソッドを使用して、XMLドキュメントを正規化(Canonicalization)された形式で出力する方法を示しています。C14Nメソッドは、XMLを標準的な形式に変換し、異なるシステム間でのXMLデータの互換性を高めるために使用されます。

generateC14N関数は、DOMDocumentオブジェクトを受け取り、C14Nメソッドを呼び出して正規化されたXMLを取得します。C14Nメソッドは、以下の引数を受け取ります。

  • $exclusive (bool): 排他的な正規化を行うかどうかを指定します(デフォルトはfalse)。
  • $withComments (bool): コメントを含めるかどうかを指定します(デフォルトはfalse)。
  • $xpath (?array): 正規化の対象となるノードをXPath式で指定します(デフォルトはnull)。
  • $nsPrefixes (?array): 名前空間プレフィックスの配列を指定します(デフォルトはnull)。

C14Nメソッドは、正規化されたXML文字列を返すか、エラーが発生した場合はfalseを返します。サンプルコードでは、DOMDocumentオブジェクトを作成し、ルート要素、コメント、テキストノードを追加しています。その後、generateC14N関数を呼び出して正規化されたXMLを取得し、結果を出力しています。$withCommentstrueに設定することで、コメントも出力に含まれるようになります。この例では、標準的なXML形式への変換と、その結果の確認を行うことができます。

DOMCharacterData::C14N()は、XMLのノードを正規化された形式で文字列として返すメソッドです。引数に$exclusive = falseを指定すると、名前空間の処理が変わる点に注意が必要です。$withComments = trueとすると、コメントも出力されます。$xpathは、正規化するノードをXPathで指定する場合に使用します。$nsPrefixesは、名前空間プレフィックスの再定義に使用します。

このメソッドは、XML構造が複雑な場合に、意図しない結果になることがあります。例えば、属性の順序や空白の扱いなどが変わる可能性があります。エラー処理として、戻り値がfalseの場合の処理を必ず記述してください。また、C14Nの仕様を理解しておくと、より安全に利用できます。

PHP DOMCharacterData::C14N() でXML正規化

1<?php
2
3/**
4 * DOMCharacterData::C14N() の使用例:XML ドキュメントを正規化 (Canonicalization) します。
5 *
6 * C14N (Canonical XML) は、XML ドキュメントを標準化された形式に変換するプロセスです。
7 * これにより、XML ドキュメントの比較、デジタル署名、およびその他の処理が容易になります。
8 * C14N11 は、C14N のより新しいバージョンで、より多くのオプションと柔軟性を提供します。
9 */
10
11// XML ドキュメントをロードします。
12$xmlString = <<<XML
13<root>
14  <child attribute="value">
15    <!-- コメント -->
16    Text content
17  </child>
18</root>
19XML;
20
21$dom = new DOMDocument();
22$dom->loadXML($xmlString);
23
24// 正規化された XML を取得します。
25// $exclusive が true の場合、排他的な C14N が使用されます。
26// $withComments が true の場合、コメントが保持されます。
27// $xpath は、正規化するノードのセットを制限するために使用できます。
28// $nsPrefixes は、名前空間プレフィックスを明示的に指定するために使用できます。
29$canonicalXml = $dom->documentElement->C14N(false, true);
30
31// 結果を出力します。
32if ($canonicalXml === false) {
33    echo "C14N に失敗しました。\n";
34} else {
35    echo "正規化された XML:\n";
36    echo $canonicalXml . "\n";
37}
38
39?>

DOMCharacterData::C14N()メソッドは、XMLドキュメントの一部または全体を、W3CのCanonical XML(C14N)仕様に従って正規化し、文字列として返します。C14NはXMLを標準化された形式に変換することで、比較やデジタル署名などの処理を容易にします。

引数には以下のものが指定可能です。$exclusiveは排他的C14Nを使用するかどうかを指定します。デフォルトはfalseです。$withCommentsはコメントを保持するかどうかを指定します。デフォルトはfalseです。$xpathは正規化するノードのセットをXPath式で指定します。$nsPrefixesは名前空間プレフィックスを明示的に指定します。

サンプルコードでは、まずXML文字列をDOMDocumentオブジェクトにロードします。次に、documentElement(ルート要素)に対してC14N()メソッドを呼び出し、XMLを正規化します。引数$exclusivefalse$withCommentstrueに設定することで、排他的でないC14Nを使用し、コメントを保持します。正規化されたXMLは文字列として返され、echoで出力されます。C14N()メソッドが失敗した場合はfalseを返すため、エラーハンドリングも行っています。

DOMCharacterData::C14N() は、XMLドキュメントを正規化するメソッドです。引数の設定によって出力が変わる点に注意が必要です。$exclusive = trueとすると、より厳密な正規化が行われ、XML文書の外部情報への依存を排除します。$withComments = true にすると、XMLコメントが保持されます。$xpath は正規化対象ノードを絞り込む際に利用しますが、XPathの記述を間違えると期待通りの結果が得られません。$nsPrefixes は名前空間プレフィックスを明示的に指定する必要がある場合に利用します。正規化に失敗した場合、false が返されるので、エラーハンドリングを必ず行ってください。C14Nの処理は、XML文書の構造や内容によってはパフォーマンスに影響を与える可能性があるため、注意が必要です。

【PHP8.x】C14Nメソッドの使い方 | いっしー@Webエンジニア