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

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

作成日: 更新日:

基本的な使い方

C14Nメソッドは、ドキュメントを正規化されたXML形式で出力するメソッドです。Dom\HTMLDocumentクラスに属し、HTMLドキュメントをXMLドキュメントとしてC14N(Canonical XML)標準に従ってシリアライズします。C14Nは、XMLドキュメントを比較したり、デジタル署名を作成したりする際に、XMLドキュメントの表現を標準化するために使用されます。

このメソッドは、ドキュメントの構造と内容を標準的な形式に変換し、名前空間の宣言、属性の順序、空白の処理などを一定のルールに従って調整します。これにより、意味的に等価なXMLドキュメントであっても、異なる表現形式を持っている場合に、それらを同一のものとして扱うことができます。

C14Nメソッドは、オプションで排他的C14N(Exclusive XML Canonicalization)を使用できます。排他的C14Nは、指定されたノードセットに影響を与える名前空間宣言のみを保持するため、より厳密な正規化が必要な場合に役立ちます。

このメソッドは、正規化されたXMLドキュメントを文字列として返します。エラーが発生した場合は、falseを返します。システムエンジニアがXMLドキュメントを扱う際、特にセキュリティ関連の処理や異なるシステム間でのデータ交換を行う場合に、C14Nメソッドを利用することで、データの整合性を確保し、潜在的な問題を回避できます。具体的には、電子署名やXMLデータの比較、キャッシュのキー生成などに利用できます。

構文(syntax)

1Dom\HTMLDocument::C14N( ?string $exclusive = null, ?bool $withComments = null, ?array $nodes = null, ?string $namespaceUris = null ) : string|false

引数(parameters)

bool $exclusive = false, bool $with_comments = false, ?array $xpath = null, ?array $ns_prefixes = null

  • bool $exclusive = false: 特定の要素のみを正規化するかどうかを指定します。trueにすると、指定されたXPathにマッチする要素とその子孫のみが正規化されます。
  • bool $with_comments = false: コメントノードを正規化に含めるかどうかを指定します。trueにすると、コメントノードも正規化されます。
  • ?array $xpath = null: 正規化の対象を限定するためのXPathクエリの配列を指定します。nullの場合はドキュメント全体が対象となります。
  • ?array $ns_prefixes = null: 名前空間プレフィックスの配列を指定します。正規化時にこれらのプレフィックスのみが考慮されます。

戻り値(return)

string|false

C14Nメソッドは、XML文書を正規化して文字列として返します。正規化に失敗した場合はfalseを返します。

サンプルコード

PHP DOMDocumentをC14N正規化する

1<?php
2
3/**
4 * DOMDocument を C14N 1.1 形式で正規化し、文字列として返します。
5 *
6 * @param DOMDocument $dom ドキュメント
7 * @param bool $exclusive 排他的 C14N を使用するかどうか (デフォルト: false)
8 * @param bool $withComments コメントを含めるかどうか (デフォルト: false)
9 * @param array|null $xpath XPath 式の配列 (デフォルト: null)
10 * @param array|null $nsPrefixes 名前空間プレフィックスの配列 (デフォルト: null)
11 *
12 * @return string|false 正規化された XML 文字列。失敗した場合は false。
13 */
14function canonicalize_dom_document(DOMDocument $dom, bool $exclusive = false, bool $withComments = false, ?array $xpath = null, ?array $nsPrefixes = null): string|false
15{
16    return $dom->C14N($exclusive, $withComments, $xpath, $nsPrefixes);
17}
18
19// 使用例:
20$dom = new DOMDocument();
21$dom->loadXML('<root><child attr="value"/></root>');
22
23$canonicalXml = canonicalize_dom_document($dom);
24
25if ($canonicalXml !== false) {
26    echo $canonicalXml . PHP_EOL;
27} else {
28    echo "C14N failed." . PHP_EOL;
29}

PHPのDom\HTMLDocumentクラスのC14Nメソッドは、XMLドキュメントを正規化された文字列として取得するために使用します。この正規化は、W3Cの「Canonical XML」と呼ばれる標準に基づき、XML文書の内容を論理的に等価な形式に変換することで、異なるシステム間での比較や検証を容易にします。

C14N()メソッドは、引数として排他的C14Nの使用有無($exclusive)、コメントを含めるかどうか($with_comments)、XPath式($xpath)、名前空間プレフィックス($ns_prefixes)を受け取ります。

$exclusiveがtrueの場合、排他的C14Nが適用され、ドキュメントのコンテキスト内で宣言された名前空間のみが保持されます。$with_commentsがtrueの場合、XMLコメントも正規化された文字列に含められます。$xpath引数にXPath式の配列を指定すると、正規化の対象を特定のノードに限定できます。$ns_prefixes引数には、名前空間プレフィックスの配列を渡すことができます。

メソッドは、正規化されたXML文字列を返します。正規化に失敗した場合(例えば、ドキュメントが不正な形式の場合)、falseを返します。サンプルコードでは、canonicalize_dom_document()関数を通じてC14N()メソッドを呼び出し、結果を標準出力に表示しています。正規化されたXMLは、元のXMLドキュメントとは空白や属性の順序などが異なる場合がありますが、意味的には等価です。

Dom\HTMLDocument::C14Nメソッドは、XMLドキュメントをC14N(Canonical XML)形式で正規化します。$exclusive引数をtrueにすると、排他的C14Nが適用され、より厳密な正規化が行われます。$withComments引数をtrueにすると、XMLコメントも出力に含まれます。$xpath引数を使うと、特定のノードセットのみを正規化できます。$nsPrefixes引数は、名前空間プレフィックスを制御するために使用されます。エラーが発生した場合、falseが返されるため、必ず戻り値をチェックしましょう。文字エンコーディングによっては、予期せぬ結果になる可能性があるため、UTF-8での利用を推奨します。XMLの構造によっては、正規化後の出力が変わることに注意してください。