【PHP8.x】C14Nメソッドの使い方
C14Nメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
C14Nメソッドは、DOMDocumentオブジェクトが扱うXML文書をXML正規化(Canonicalization)するメソッドです。これは、XML文書の物理的な表現の違いを吸収し、論理的に同じ内容を持つXML文書が常に同じバイト列に変換されるようにすることで、その同一性を保証することを目的としています。
XML正規化は、特にデジタル署名など、XML文書のセキュリティや整合性を確保する場面で重要な役割を果たします。例えば、空白文字や属性の順序、名前空間宣言の記述方法など、人間にとっては同じ意味でも、バイト列としては異なるXML文書と見なされることがあります。C14Nメソッドで正規化を行うことで、これらの表現の違いを標準的な形式に統一し、論理的に同一のXML文書からは常に同じバイト列が生成されます。これにより、デジタル署名が正確に検証できるなど、文書の真正性を保証することが可能になります。
このメソッドには、排他的正規化を行うかどうかを指定する$exclusive引数と、コメントを含めるかどうかを指定する$with_comments引数があり、両引数ともにデフォルト値はfalseです。これらの引数で正規化の挙動を調整できます。メソッドは正規化されたXML文書の文字列を返しますが、処理に失敗した場合はfalseを返します。XML文書が適切に読み込まれていない場合や、不正な文書である場合は、期待通りの結果が得られない可能性があるため注意が必要です。
構文(syntax)
1<?php 2 3$dom = new DOMDocument(); 4 5$result = $dom->C14N( 6 exclusive: null, 7 with_comments: null, 8 xpath: null, 9 ns_prefixes: null 10);
引数(parameters)
bool $exclusive = false, bool $with_comments = false, ?array $xpath = null, ?array $ns_prefixes = null
- bool $exclusive = false: 正規化を排他的モードで行うかどうかを指定します。排他的モードでは、指定されたXPath式に一致する要素のみが正規化の対象となります。
- bool $with_comments = false: コメントを含めて正規化するかどうかを指定します。
- ?array $xpath = null: 正規化の対象とする要素を指定するためのXPath式を配列で指定します。
- ?array $ns_prefixes = null: 正規化時に考慮する名前空間のプレフィックスを配列で指定します。
戻り値(return)
string|false
C14Nメソッドは、XML文書を正規化して文字列として返します。正規化に失敗した場合はfalseを返します。
サンプルコード
PHP DOMDocument C14NでXMLを正規化する
1<?php 2 3// XML ドキュメントを正規化 (Canonicalization) するサンプルコード 4// C14N (Canonical XML) は、XML ドキュメントを標準化された形式に変換するプロセスです。 5 6// 新しい DOMDocument オブジェクトを作成します。 7$dom = new DOMDocument('1.0', 'utf-8'); 8 9// ルート要素を作成します。 10$root = $dom->createElement('root'); 11$dom->appendChild($root); 12 13// 子要素を作成します。 14$child1 = $dom->createElement('child1', 'value1'); 15$root->appendChild($child1); 16 17$child2 = $dom->createElement('child2', 'value2'); 18$root->appendChild($child2); 19 20// C14N を実行し、正規化された XML 文字列を取得します。 21// $exclusive = true 排他的C14Nを有効にします。これにより、ドキュメントのサブツリーのみが正規化されます。 22// $with_comments = true コメントを含めます。 23// $xpath 特定のノードセットのみを正規化するために使用できるXPath式の配列。 24// $ns_prefixes 正規化された出力に含める名前空間プレフィックスの配列。 25$canonicalXml = $dom->C14N(false, false, null, null); 26 27// 正規化された XML を出力します。 28if ($canonicalXml !== false) { 29 echo $canonicalXml . PHP_EOL; 30} else { 31 echo "C14N failed." . PHP_EOL; 32} 33 34?>
このPHPサンプルコードは、XMLドキュメントを正規化(Canonicalization)するDOMDocument::C14Nメソッドの利用例を示しています。C14Nは、XMLドキュメントを標準化された形式に変換する処理であり、異なるシステム間でのXMLデータの比較や署名などに役立ちます。
まず、DOMDocumentオブジェクトを新規に作成し、XMLドキュメントの構造を構築します。ここでは、ルート要素rootと、その子要素child1、child2を作成し、それぞれの要素に値を設定しています。
DOMDocument::C14Nメソッドは、XMLドキュメントを正規化し、その結果を文字列として返します。引数には、正規化のオプションを指定できます。
$exclusive: 排他的C14Nを有効にするかどうか(デフォルトはfalse)。trueにすると、ドキュメントのサブツリーのみが正規化されます。$with_comments: コメントを正規化された出力に含めるかどうか(デフォルトはfalse)。$xpath: 正規化するノードセットをXPath式で指定する配列(デフォルトはnull)。$ns_prefixes: 正規化された出力に含める名前空間プレフィックスの配列(デフォルトはnull)。
サンプルコードでは、これらの引数をすべてデフォルト値(false, false, null, null)で使用しています。
DOMDocument::C14Nメソッドは、正規化に成功した場合に正規化されたXML文字列を返し、失敗した場合はfalseを返します。サンプルコードでは、戻り値がfalseでないことを確認し、正規化されたXML文字列を出力しています。
DOMDocument::C14Nメソッドは、XMLドキュメントを正規化する際に利用します。引数に指定する$exclusiveは、排他的C14Nを有効にするかどうかを決定します。trueにすると、XMLドキュメント全体ではなく、一部のサブツリーのみが正規化される点に注意が必要です。$with_commentsは、コメントを正規化された出力に含めるかを指定します。$xpathを使用すると、特定のノードセットのみを正規化できます。$ns_prefixesは、出力に含める名前空間プレフィックスを指定します。エラーが発生した場合、C14Nメソッドはfalseを返すため、戻り値のチェックは必須です。XMLの構造や目的に応じて、引数を適切に設定することが重要です。特に$exclusiveパラメータは、意図しない結果を招く可能性があるため、注意深く設定してください。
PHP DOMDocument C14N 1.1 でXML正規化する
1<?php 2 3// XMLドキュメントをC14N 1.1形式で正規化する例 4function canonicalizeXML(string $xmlString, bool $exclusive = false, bool $withComments = false, ?array $xpath = null, ?array $nsPrefixes = null): string|false 5{ 6 $dom = new DOMDocument(); 7 $dom->loadXML($xmlString); 8 9 // C14N 1.1形式で正規化 10 $canonicalXml = $dom->C14N($exclusive, $withComments, $xpath, $nsPrefixes); 11 12 return $canonicalXml; 13} 14 15// サンプルXMLデータ 16$xml = <<<XML 17<root> 18 <element attribute="value"> 19 <!-- コメント --> 20 テキスト 21 </element> 22</root> 23XML; 24 25// C14N 1.1形式で正規化(コメントを含む) 26$canonicalizedXml = canonicalizeXML($xml, false, true); 27 28if ($canonicalizedXml !== false) { 29 echo $canonicalizedXml . "\n"; 30} else { 31 echo "正規化に失敗しました。\n"; 32} 33 34?>
このサンプルコードは、PHPのDOMDocumentクラスのC14Nメソッドを使用して、XMLドキュメントをC14N 1.1形式で正規化する方法を示しています。C14N(Canonical XML)とは、XMLドキュメントを標準化された形式に変換するプロセスのことで、デジタル署名やデータ比較において重要です。
canonicalizeXML関数は、XML文字列を受け取り、DOMDocumentオブジェクトを作成してXMLをロードします。そして、C14Nメソッドを呼び出してXMLを正規化します。
C14Nメソッドの引数は以下の通りです。
$exclusive: 排他的正規化を行うかどうかを指定するブール値。デフォルトはfalseです。$withComments: コメントを含めるかどうかを指定するブール値。trueの場合、コメントも正規化されます。デフォルトはfalseです。$xpath: 正規化の対象とするノードをXPath式で指定する配列。nullの場合、ドキュメント全体が対象となります。$nsPrefixes: 名前空間プレフィックスを制限する配列。nullの場合、すべての名前空間プレフィックスが使用されます。
C14Nメソッドは、正規化されたXML文字列を返します。エラーが発生した場合はfalseを返します。
サンプルコードでは、コメントを含むXMLをC14N 1.1形式で正規化し、結果を出力しています。正規化に失敗した場合は、エラーメッセージが表示されます。この例では$withCommentsにtrueを渡すことで、XMLに含まれるコメントも正規化後のXMLに含まれるようになります。
DOMDocument::C14Nメソッドは、XMLドキュメントを標準的な形式に変換する際に使用します。引数の$exclusiveは、排他的C14Nを適用するかどうかを指定します。$with_commentsをtrueにすると、コメントも正規化結果に含まれます。$xpathは、正規化するノードをXPathで指定する場合に使用します。$ns_prefixesは名前空間プレフィックスを指定します。
loadXMLでXMLを読み込む際、不正なXML形式だとエラーが発生する可能性があるため、事前にXMLの妥当性を確認することが重要です。C14NはXMLの構造を変化させる可能性があるため、適用前後のXMLを比較し、意図しない変更がないか確認してください。C14N後のXMLは、デジタル署名などのセキュリティ用途で利用されることが多いです。