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

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

作成日: 更新日:

基本的な使い方

C14Nメソッドは、DOMNodeクラスに属し、XML文書を標準的な形式に正規化する処理を実行するメソッドです。このメソッドは、XML文書の内容は変えずに、その表現形式を一意に整える「XML正規化」を行います。

具体的には、属性の順序、名前空間の宣言、空白文字の扱いなど、見た目には同じでも細部が異なる可能性のある要素を統一し、常に同じ内容のXMLからは同じ文字列が生成されるようにします。この機能は、XMLデジタル署名やXML暗号化など、XML文書の同一性を厳密に検証したり、安全に扱ったりする必要がある場面で特に重要です。

正規化の際には、排他的なルール適用、コメントを含めるか否か、特定のノードのみを対象にするかといったオプションを指定できます。実行後は、正規化されたXML文書を表す文字列を返します。これにより、XML文書の信頼性と互換性が向上し、異なるシステム間でのデータ連携が確実なものになります。

構文(syntax)

1<?php
2$domNode = new DOMDocument(); // DOMNodeを継承したオブジェクトの例
3$c14nResult = $domNode->C14N();
4?>

引数(parameters)

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

PHP:

  • bool $exclusive = false: 正規化に排他モードを使用するかどうかを指定します。true の場合、属性の正規化は子要素の属性のみに適用されます。
  • bool $with_comments = false: 正規化にコメントを含めるかどうかを指定します。true の場合、コメントも正規化されます。
  • ?array $xpath = null: 正規化に含めるノードを XPath 式で指定します。指定しない場合は、現在のノードのすべての子孫が対象となります。
  • ?array $ns_prefixes = null: 正規化に使用する名前空間プレフィックスの配列を指定します。

戻り値(return)

string|false

DOMNode::C14Nメソッドは、XMLノードとその子孫を正規化(CANONICAL XML)した文字列を返します。正規化に失敗した場合はfalseを返します。

サンプルコード

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

1<?php
2
3/**
4 * DOMNode::C14N() のサンプルコード
5 *
6 * XML ドキュメントのノードを正規化 (Canonicalization) して文字列として取得します。
7 */
8
9// テスト用のXMLドキュメントを作成
10$xmlString = <<<XML
11<root>
12  <child attr1="value1" attr2="value2">
13    <!-- コメント -->
14    テキストノード
15  </child>
16</root>
17XML;
18
19// DOMDocumentをロード
20$dom = new DOMDocument();
21$dom->loadXML($xmlString);
22
23// 正規化したいノードを選択 (ここではルートノード)
24$node = $dom->documentElement;
25
26// C14Nを実行
27$canonicalXML = $node->C14N(
28    exclusive: false, // 排他的な正規化を行うかどうか
29    with_comments: true, // コメントを含めるかどうか
30    xpath: null, // XPath式で選択されたノードのみを正規化するかどうか
31    ns_prefixes: null // 名前空間プレフィックスの配列
32);
33
34// 結果を出力
35if ($canonicalXML !== false) {
36    echo $canonicalXML . PHP_EOL;
37} else {
38    echo "C14N failed." . PHP_EOL;
39}

このサンプルコードは、PHPのDOMNodeクラスにおけるC14Nメソッドの使い方を示しています。C14Nメソッドは、XMLドキュメント内のノードを正規化(Canonicalization)し、その結果を文字列として取得するために使用します。正規化とは、XMLドキュメントの内容を特定の規則に従って標準化する処理のことです。

まず、テスト用のXMLドキュメントを文字列として定義し、それをDOMDocumentオブジェクトにロードしています。次に、正規化したいノードを選択します。この例では、ルートノード(documentElement)を選択しています。

C14Nメソッドは、以下の引数を受け取ります。exclusive は排他的な正規化を行うかどうかを指定するブール値です。with_comments はコメントを含めるかどうかを指定するブール値です。xpath はXPath式で選択されたノードのみを正規化する場合に使用する配列です。ns_prefixes は名前空間プレフィックスの配列を指定します。これらの引数は省略可能で、デフォルト値が設定されています。

サンプルコードでは、exclusivefalse(排他的な正規化を行わない)、with_commentstrue(コメントを含める)、xpathns_prefixesnull(すべてのノードを正規化し、名前空間プレフィックスは指定しない)に設定しています。

C14Nメソッドの戻り値は、正規化されたXML文字列です。処理が失敗した場合は false が返されます。サンプルコードでは、戻り値が false でないことを確認し、正規化されたXML文字列を出力しています。もし false が返された場合は、エラーメッセージが表示されます。

DOMNode::C14N()メソッドは、XMLドキュメントの一部を標準化された形式の文字列で取得する際に利用します。引数の設定によって出力が変わる点に注意が必要です。exclusiveは排他的な正規化を行うかどうかを指定し、with_commentsはコメントを含めるかを指定します。xpathで特定のノードのみを正規化対象にできますが、指定方法を間違えると期待通りに動作しません。ns_prefixesは名前空間プレフィックスを扱う際に使用します。エラーが発生した場合falseが返るので、必ず戻り値を確認し、エラーハンドリングを行いましょう。また、C14NはXML署名などのセキュリティ関連の処理で利用されることが多いため、各オプションの意味を理解して適切に設定することが重要です。

PHP DOMDocument C14NによるXML正規化

1<?php
2
3// DOMDocument を作成し、XML をロードする
4$dom = new DOMDocument();
5$dom->loadXML('<root><child attr="value">text</child></root>');
6
7// ルートノードを取得
8$root = $dom->documentElement;
9
10// C14N (Canonical XML) を実行し、結果を出力する
11// exclusive, with_comments, xpath, ns_prefixes の引数は省略可能
12$canonicalXml = $root->C14N(exclusive: true, with_comments: false);
13
14if ($canonicalXml !== false) {
15    echo $canonicalXml;
16} else {
17    echo "C14N failed.";
18}
19
20?>

このPHPのサンプルコードは、DOMNodeクラスのC14Nメソッドを使用して、XMLドキュメントのノードを標準化された形式(Canonical XML)に変換する方法を示しています。C14Nメソッドは、XMLの構造や属性の順序などを一定のルールに従って変換することで、XML文書の内容が同じであれば、表現形式が異なっていても同一とみなせるようにします。

まず、DOMDocumentクラスのインスタンスを作成し、loadXMLメソッドでXMLデータをロードします。次に、documentElementプロパティを使用して、XMLドキュメントのルートノードを取得します。

C14Nメソッドは、取得したノードに対してCanonical XML変換を実行します。引数として、exclusive(排他的な標準化を行うかどうか)、with_comments(コメントを含めるかどうか)、xpath(標準化するノードを選択するXPath)、ns_prefixes(名前空間プレフィックスの配列)を指定できます。このサンプルコードでは、exclusivetrueに設定して排他的な標準化を行い、with_commentsfalseに設定してコメントを除外しています。他の引数は省略しています。

C14Nメソッドは、標準化されたXML文字列を返します。変換に失敗した場合はfalseを返します。サンプルコードでは、返り値がfalseでないことを確認し、成功した場合は標準化されたXML文字列を出力し、失敗した場合はエラーメッセージを出力します。このメソッドを使用することで、XMLデータの比較やデジタル署名などの処理を確実に行うことができます。

DOMNode::C14Nメソッドは、XMLドキュメントまたはその一部を、標準化された形式(Canonical XML)に変換する機能です。exclusive引数をtrueにすると、名前空間の処理が厳密になり、より移植性の高いXMLを生成できます。with_comments引数をtrueにすると、XMLコメントも出力に含めることができます。xpath引数とns_prefixes引数は、XMLの一部のみを標準化したい場合に利用します。

このメソッドは、XMLのデジタル署名や、異なるシステム間でのXMLデータの比較に役立ちます。エラーが発生した場合、falseが返るため、必ず返り値を確認してください。また、C14N処理はXMLの構造を変化させる可能性があるため、データの整合性に注意して利用してください。

関連コンテンツ

関連プログラミング言語